为什么主叫两次?

Jon*_*an. 4 c fork

我刚学会了fork,据我所知,子进程从fork调用开始执行(否则fork会递归?).

但是在此代码中(ideone链接):

int main() {
  printf("%d: Common code1\n", getpid());
  if (fork() != 0) {
    printf("%d: Parent code\n", getpid());
  } else {
    printf("%d: Child code\n", getpid());
  }
  printf("%d: Common code\n", getpid());
}
Run Code Online (Sandbox Code Playgroud)

输出是:

27380: Common code1
27380: Parent code
27380: Common code
27380: Common code1
27383: Child code
27383: Common code
Run Code Online (Sandbox Code Playgroud)

我不明白为什么打印第4行?我可以理解它是从子进程打印出来的,而fork是从main打印的,但是它是从父进程打印的,而fork不会调用main.

mil*_*non 8

好问题!起初我有点困惑.

使用时printf,输出被缓冲.这意味着printf在达到换行符之前,打印的内容实际上不会刷新到控制台,甚至直到程序在重定向stdout时终止.

在这种情况下.在fork期间,父PID的stdout缓冲区被复制到子节点.然后,父节点和子节点在终止之前写入其缓冲区.这导致重复的数据被打印.

是一个包含fflush(stdout);before之前的ideone链接fork().