【发布时间】:2019-07-21 17:37:38
【问题描述】:
我试图使用fork() 函数,但出现了一些奇怪的行为。父进程的主要功能的一部分(不是全部)似乎在调用fork() 之后立即运行,但前提是可执行文件的输出通过管道传输到命令行的某处。
我在 Mac OS Mojave 上注意到了这一点,但我在 Ubuntu 18.04 上测试了相同的代码,它表现出相同的行为。我不知道为什么会这样。
这是fork.c文件中的测试代码:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
pid_t child_pid;
printf("Beginning of main for process %d\n", getpid());
if ((child_pid = fork())) {
printf("Forked process %d\n", child_pid);
} else {
printf("Beginning of forked process %d\n", getpid());
}
}
这是一个使用此代码的 shell 会话:
$ cc fork.c
$ ./a.out
Beginning of main for process 98373
Forked process 98374
Beginning of forked process 98374
$ ./a.out | cat
Beginning of main for process 98378
Forked process 98380
Beginning of main for process 98378
Beginning of forked process 98380
如你所见,main() 开头的语句在父进程中执行两次,如果输出通过管道传送到某处。
【问题讨论】:
-
stdout通常是行缓冲的,但如果连接到管道则完全缓冲。在fork之前调用fflush(NULL),它会按您的预期工作。