如何在C语言中同时运行两个子进程?

3
我正在学习并发编程,但是我甚至无法让基础部分工作。我有一个名为fork.c的文件,其中包含一个名为main的方法。在这个方法中,我fork两次,创建了子进程1和2。
在子进程1中,我打印字符'A'50次。
在子进程2中,我打印字符'B'50次。
当我运行代码时,输出结果是AAAAA...AAAABBBBBB....BBBBBB,但从未出现过像ABABABABABABAB....这样的结果。事实上,有时我甚至会得到BBBBB....BBBBAAAA....AAAAA的结果。
那么我为什么会遇到这种情况呢?也许我完全错了。
#include <stdlib.h>
#include <stdio.h>

void my_char(char n) {
    write(1, &n, 1);
}

int main() {
    int status;
    pid_t child1, child2;

    if (!(child1 = fork())) {
        // first childi
        int a;
        for (a = 0; a < 50; a++) {
            my_char('A'); 
        }
        exit(0);
    } else if (!(child2 = fork())) {
        // second child
        int a;
        for (a = 0; a < 50; a++) {
            my_char('B');
        }
        exit(0);
    } else {
        // parent
        wait(&child1);
        wait(&child2);
        my_char('\n');
    }

    return 0;
}   

3
当人们谈论“并发编程”时,“fork”可能不是大多数人想到的东西... - Kerrek SB
为什么呢?抱歉,我对此还很陌生。 - Jordan Scales
fork 创建一个新的单线程进程。 "并发" 通常指在一个单一进程内进行多线程处理。 - Kerrek SB
1
你的进程只是在争夺一个资源,即输出设备。那么它们如何能够并发运行呢? - David Schwartz
2个回答

8

它们是同时运行的,但进程在启动后几乎立即结束。换句话说,它们太短了,无法真正重叠。

编辑:

启动另一个进程所需的时间比运行它们所需的时间更长。因此,重叠的机会很小。(我将省略缓冲问题)

您需要使每个进程执行更多的工作。尝试打印超过50个。打印超过10000可能已经足够了。


完美。证明。非常感谢。我开始担心自己不知道fork是怎么工作的了。 - Jordan Scales
2
或者你可以在循环内部稍微调用一下sleep。根据你的操作系统/编译器,尝试使用usleep或Sleep。 - Anthony Accioly

3

我认为这样更容易理解fork()的工作原理:

#include <stdlib.h>
#include <stdio.h>

int main() {
    pid_t child1, child2;
    printf("Start\n");
    if (!(child1 = fork())) {
        // first childi
        printf("\tChild 1\n");
        sleep(5);
        exit(0);
    } else if (!(child2 = fork())) {
        // second child
        printf("\tChild 2\n");
        sleep(5);
        exit(0);
    } else {
        // parent
        printf("Parent\n");
        wait(&child1);
            printf("got exit status from child 1\n");
        wait(&child2);
            printf("got exit status from child 2\n");
    }

    return 0;
}

...这是输出结果:

    Start
        Child 1
    Parent
        Child 2
    got exit status from child 1
    got exit status from child 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接