C fork程序解释

C fork program explanation

我有如下代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    printf("a\n");
    fork();

    printf("b\n");
    if(fork() == 0) {
        printf("c\n");
        exit(0);    
    }
    printf("d\n");
    return 0;
}

输出:

a
b
d
a
b
c
a
b
d
a
b
c

我不知道为什么输出重复了很多次。

I don't know why the output duplicated many times

因为printf()被缓冲了。

当进程调用 fork() 时,生成的子进程获得父进程输出缓冲区的副本。

您可以通过在每次调用 fork() 之前放置 fflush(stdout) 来清空此输出缓冲区。在那种情况下输出应该是:

a
b
b
d
c
d
c

请注意,如果输出引用终端,默认情况下它将是 行缓冲,即:每次 \n 时都会转储缓冲区发送到输出。如果您将输出重定向到文件,则不是这样。

当您调用 fork() 时,它会获取调用进程的输出缓冲区的副本。默认情况下启用缓冲,因此您会得到这种行为。 您可以使用

fflush(stdout);

在调用 fork() 之前。或者,您也可以使用

禁用缓冲
setbuf(stdout, NULL);

您可以阅读有关 fork 的更多信息 here。如果您需要更多帮助,请告诉我。

答案已经在评论里了。您正在呼叫 fork() 两次。所以解决方案是只调用一次并将结果保存在像这样的变量中int pid = fork()。此外,您应该检查 fork-call 是否失败(如果失败,则 returns 为负值)。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    printf("a\n");

    int pid = fork();
    if (pid < 0)
    {
        fprintf(stderr, "Can't fork!");
        exit(1);
    }

    printf("b\n");

    if(pid == 0)
    {
        printf("c\n");
    }
    else
    {
        printf("d\n");
    }

    return 0;
}