代码看起来像这样
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
printf("Starting process id is %d\t", getpid());
if (fork() == 0)
fork();
else {
fork();
fork();
exit(0);
}
printf("%d\t", getpid());
}
在大多数情况下,输出在跟踪时表现如预期。也就是说,如果我们以身份n
开头,我们会打印n+1
和n+5
。但是,当我打印起始进程ID时,它会被打印5次,我不知道为什么。任何帮助将不胜感激
示例运行的输出如下所示
启动进程ID为27252 pc @ pc-VirtualBox:〜/ Desktop $ 开始porcess id是27252开始porcess id是27252开始 porcess id是27252 27253开始的porcess id是27252开始 进程ID是27252 27257
但我希望看到
凝视过程id为27252 27253 27257
答案 0 :(得分:2)
这是因为printf
正在缓冲输出,而不是立即将其刷新到设备。
因此,当您进行分叉时,进程的副本也会缓存该信息,每个进程都会输出完整的字符串。
你应该在每个分支前尝试调用fflush(stdout)
(可能还有fsync(fileno(stdout))
,具体取决于你的平台)。
答案 1 :(得分:1)