关于linux中的fork系统调用

时间:2017-10-05 05:01:24

标签: c++ printf fork stdout stdio

好的我正在使用linux中的以下C / C ++代码:

int main() {
    printf("hello");
    Pid = fork();
    if (pid > 0)
            printf("I’m the parent!");
    else
            printf("I’m the child");
    return 0;
}

这是我的输出: set_index

我的CS教授的笔记说明如下:

  

创建新的子进程后,两个进程都将执行   fork()系统调用后的下一条指令。请注意   Unix将精确复制父级的地址空间并给予它   对孩子。因此,父进程和子进程是分开的   地址空间。

出于这个原因,我非常困惑为什么它不仅会再次输出当前目录而且还会再次输出“你好”?我认为它会做到这一点的唯一可能原因是它说“复制地址空间”只是在fork之前重新运行所有命令,但这没有任何意义。

1 个答案:

答案 0 :(得分:5)

使用printf时,输出会被缓冲。因此,请在fflush之后立即\nprintf

添加fflush\n会强制刷新缓冲区并输出到屏幕。这发生在前叉之前,因此只打印一次。

C99 7.19.2p2

  

最后一行是否需要终止换行符   实现定义的。

     

它没有定义终止换行字符会发生什么   没有提供。由于标准没有定义行为,所以   行为未定义。