子进程在创建时从第一行开始(使用fork)

Som*_*guy 4 c linux fork child-process

为什么我的子进程从main的第一行开始?当我运行我的程序时,"Hello There"将被打印两次.子进程应该在fork之后开始,我对吗?

int main(){
       printf("Hello There!");
       pid_t PID;
       PID = fork();

       if(PID == 0){
          //Child
       }
       else{
          //parent
       }
}
Run Code Online (Sandbox Code Playgroud)

这对我来说是个大问题,因为在我的真实程序中,我在fork之前使用mmap制作私有文件.由于这一点,我发生了什么,父母和孩子有不同的私人文件..

Mic*_*ael 6

不会被叫两次......这是一种视错觉!:)

但是......你的STDOUT没有被刷新,因为没有\n,你的fork然后复制你的整个状态,两个进程都在进行,最终它们刷新,都刷新它们的输出缓冲区(在fork()期间复制),并导致输出出现两次.

如果添加\n,请更改printf行,如下所示:

printf("Hello There!\n");
Run Code Online (Sandbox Code Playgroud)

您现在将获得预期的结果.

或者明确刷新输出:

printf("Hello There!");
fflush(stdout);
Run Code Online (Sandbox Code Playgroud)