为什么调用Main两次? [英] Why is main called twice?

查看:11
本文介绍了为什么调用Main两次?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚了解了fork,根据我的理解,子进程从对fork的调用开始执行(否则fork将是递归的?)。

然而,在此代码中(ideone link):

int main() {
  printf("%d: Common code1
", getpid());
  if (fork() != 0) {
    printf("%d: Parent code
", getpid());
  } else {
    printf("%d: Child code
", getpid());
  }
  printf("%d: Common code
", getpid());
}

输出为:

27380: Common code1
27380: Parent code
27380: Common code
27380: Common code1
27383: Child code
27383: Common code

我不明白为什么打印第4行?如果它是从子进程和名为main的派生进程打印的,但它是从父进程打印的,并且fork不调用main,我可以理解。

推荐答案

问得好!一开始我有点困惑。

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

在这种情况下。父PID的标准输出缓冲区在派生过程中被复制到子进程。然后,父进程和子进程都会在终止之前写入其缓冲区。这将导致打印重复的数据。

Here是在调用fork()之前包含fflush(stdout);的理想链接。

这篇关于为什么调用Main两次?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆