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;
}