【发布时间】:2015-04-23 10:03:36
【问题描述】:
我在书籍和在线资源中读到 fork() 系统调用会创建当前进程的副本,并且两个进程都从进行 fork() 系统调用后的那一点开始执行。对吗?
如果正确,为什么下面的代码会打印“Test Test”?它应该只打印一次“测试”(由父进程)。
#include <sys/types.h> /* pid_t */
#include <sys/wait.h> /* waitpid */
#include <stdio.h> /* printf, perror */
#include <stdlib.h> /* exit */
#include <unistd.h> /* _exit, fork */
int main(void)
{
int ctr =1;
int pc = 1;
printf("%s", "Test ");
pid_t pidmain = fork();
return EXIT_SUCCESS;
}
【问题讨论】:
-
在“test”字符串中添加一个“\n”。
-
@wildplasser 添加 \n 后令人惊讶的是,我得到了测试(单次)而不是 2 次。但为什么呢?
-
标准输出的行缓冲。程序的 fork() d 副本在标准输出上都有一个半填充的缓冲区,该缓冲区在程序退出时被刷新。 (两个出口)。为了证明这一点,您还可以在 fork() 之前添加 sleep(1)
-
@wallyk 我会说这是一个公平的重复。