child 进程从创建时的第一行开始(使用fork)
child process starts from the first line when created (with fork)
为什么我的child进程从main的第一行开始?当我运行我的程序时,"Hello There"会被打印两次。 Child process 应该在 fork 后开始上线,我说的对吗?
int main(){
printf("Hello There!");
pid_t PID;
PID = fork();
if(PID == 0){
//Child
}
else{
//parent
}
}
这对我来说是个大问题,因为在我的真实程序中,我在 fork 之前用 mmap 制作私有文件。因为这件事发生在我身上,parent 和 child 有不同的私人文件..
不是被调用了两次...这是一种视错觉! :)
但是......你的 STDOUT 没有被刷新,因为没有 \n,你的 fork 然后复制你的整个状态,两个进程都在进行,最终他们刷新,都刷新他们的输出缓冲区(在期间复制fork()), 并导致输出出现两次。
如果你添加一个\n,那么改变你的printf行如下:
printf("Hello There!\n");
您现在将获得预期的结果。
或者显式刷新输出:
printf("Hello There!");
fflush(stdout);
为什么我的child进程从main的第一行开始?当我运行我的程序时,"Hello There"会被打印两次。 Child process 应该在 fork 后开始上线,我说的对吗?
int main(){
printf("Hello There!");
pid_t PID;
PID = fork();
if(PID == 0){
//Child
}
else{
//parent
}
}
这对我来说是个大问题,因为在我的真实程序中,我在 fork 之前用 mmap 制作私有文件。因为这件事发生在我身上,parent 和 child 有不同的私人文件..
不是被调用了两次...这是一种视错觉! :)
但是......你的 STDOUT 没有被刷新,因为没有 \n,你的 fork 然后复制你的整个状态,两个进程都在进行,最终他们刷新,都刷新他们的输出缓冲区(在期间复制fork()), 并导致输出出现两次。
如果你添加一个\n,那么改变你的printf行如下:
printf("Hello There!\n");
您现在将获得预期的结果。
或者显式刷新输出:
printf("Hello There!");
fflush(stdout);