for(i=0;i<2;i++)
if(fork()==0)
printf("Hi");
我预期得到3个“Hi”,但实际上得到了4个。
因此,我将printf
编辑为printf("Hi %d %d %d ",i,getpid(),getppid());
。
所创建的第一个子进程打印出两个相同的“Hi”,其值都为0,而且它的pid和父进程的pid也相同。为什么?
for(i=0;i<2;i++)
if(fork()==0)
printf("Hi");
我预期得到3个“Hi”,但实际上得到了4个。
因此,我将printf
编辑为printf("Hi %d %d %d ",i,getpid(),getppid());
。
所创建的第一个子进程打印出两个相同的“Hi”,其值都为0,而且它的pid和父进程的pid也相同。为什么?
这很有趣,看起来答案是输出缓冲。例如我们有:
#include <unistd.h>
#include <stdio.h>
int main() {
for(int i=0;i<2;i++) {
if(fork()==0) {
printf("Hi %d %d %d\n",i,getpid(),getppid());
}
}
}
如果在终端中运行此代码,将会有3行输出,但如果将输出重定向到less,则会有4行输出!
如果在printf()之后刷新缓冲区,问题将会消失:
// ...
printf("Hi %d %d %d\n",i,getpid(),getppid());
fflush(stdout);
// ...