关于linux中的fork系统调用

CNo*_*der 4 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;
}
Run Code Online (Sandbox Code Playgroud)

这是我的输出: 程序输出截图

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

创建新的子进程后,两个进程将在fork()系统调用后执行下一条指令.请注意,Unix将精确复制父级的地址空间并将其提供给孩子.因此,父进程和子进程具有单独的地址空间.

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

msc*_*msc 5

使用时printf,输出被缓冲.所以,做一个fflush\n之后printf.

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

C99 7.19.2p2

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

它没有定义如果没有提供终止换行字符会发生什么.由于标准未定义行为,因此行为未定义.