gpt4 book ai didi

c - Unix fork() 系统调用什么时候运行?

转载 作者:IT王子 更新时间:2023-10-29 01:01:33 26 4
gpt4 key购买 nike

void child(int pid){
printf("Child PID:%d\n",pid);
exit(0);
}
void parent(int pid){
printf("Parent PID:%d\n",pid);
exit(0);
}

void init(){
printf("Init\n");//runs before the fork
}


int main(){

init();//only runs for parent i.e. runs once
printf("pre fork()");// but this runs for both i.e. runs twice
//why???

int pid = fork();

if(pid == 0){
child(pid); //run child process
}else{
parent(pid);//run parent process
}
return 0;
}

输出:

Init
pre fork()Parrent PID:4788
pre fork()Child PID:0

我在 Unix 操作系统(在我的例子中是 Ubuntu)中有一个进程。我一辈子都无法理解这是如何工作的。我知道 fork() 函数将我的程序分成两个进程,但从哪里来呢?它会创建一个新进程并再次运行整个主函数吗?如果是,为什么 init() 只运行一次而 printf() 运行两次?

为什么 printf("pre fork()"); 运行两次而 init() 只运行一次?

最佳答案

只有一个进程直到 fork 。也就是说,该路径只执行一次。 fork 之后有 2 个进程,因此系统调用之后的代码由两个进程执行。您忽略的是两者都终止并且都将调用 exit

在您的代码中,您没有刷新 stdio。所以两个进程都这样做(exit 刷新 stdio 缓冲区)——这就是您看到该输出的原因。

试试这个:

printf("pre fork()\n");
^^ should flush stdout

或者也许

printf("pre fork()\n");
fflush(stdout);

关于c - Unix fork() 系统调用什么时候运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8863447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com