C fork程序说明

C fork程序说明,c,fork,stdio,C,Fork,Stdio,我有一个代码如下 #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");

我有一个代码如下

#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;
}
我不知道为什么输出重复了很多次

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

因为
printf()
是缓冲的

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

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

a
b
b
d
c
d
c

请注意,如果输出引用到终端,则默认情况下会对其进行行缓冲,即:每次向输出发送
\n
时都会转储缓冲区。如果将输出重定向到文件,则情况并非如此。

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

fflush(stdout);
在调用fork()之前。或者,也可以使用禁用缓冲

setbuf(stdout, NULL);

你可以阅读更多关于fork的内容。如果您需要更多帮助,请告诉我。

答案已在评论中。您正在调用
fork()
两次。因此,解决方案是只调用它一次,然后将结果保存在如下变量中
int pid=fork()
。此外,您应该检查fork调用是否失败(如果失败,则返回负值)

#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
printf(“a\n”);
int-pid=fork();
if(pid<0)
{
fprintf(stderr,“不能叉!”);
出口(1);
}
printf(“b\n”);
如果(pid==0)
{
printf(“c\n”);
}
其他的
{
printf(“d\n”);
}
返回0;
}

您是否将输出重定向到文件?您调用了
fork
两次,第一次您甚至不关心它的结果(但是您应该,并且您需要处理它的失败),在
printf
中使用,例如
printf(“a from pid%d\n”,(int)getpid())运行此程序的方式和位置很重要。此外,您还应该说明预期的输出。错误。缓冲区解释了顺序,但不是输出的数量。@BasileStarynkevitch缓冲区解释了为什么
a
显示了不止一次,为什么
b
显示了四次而不是两次。“每次a\n发送到输出时,缓冲区都会被转储”---如果在每次
\n
之后刷新它,为什么那里有4个
a
s?不,缓冲不能解释这一点。
a
被多次打印的事实是由于
fork
(不是
printf
)的行为造成的。@zerkms我的意思是:如果输出引用一个终端,那么默认情况下它是行缓冲的:默认行为可以更改。
setbuf(stdout, NULL);
#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;
}