为什么我的子进程从main的第一行开始?当我运行我的程序时,“Hello There”将被打印两次。子进程应该在fork之后开始,我是对的吗?
int main(){
printf("Hello There!");
pid_t PID;
PID = fork();
if(PID == 0){
//Child
}
else{
//parent
}
}
这对我来说是个大问题,因为在我的真实程序中,我在fork之前使用mmap制作私有文件。由于这一点,我发生了什么,父母和孩子有不同的私人档案..
答案 0 :(得分:6)
NOT 被叫两次......这是一种视错觉! :)
但是......你的STDOUT没有刷新,因为没有\ n,你的fork然后复制你的整个状态,两个进程都在进行,最终它们刷新,都刷新它们的输出缓冲区(在fork期间复制) )),并使输出出现两次。
如果添加\ n,请更改printf行,如下所示:
printf("Hello There!\n");
您现在可以获得预期的结果。
或明确刷新输出:
printf("Hello There!");
fflush(stdout);