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

C Unix fork()系统调用什么时候运行?,c,linux,unix,fork,C,Linux,Unix,Fork,输出: 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 fo

输出:

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;
}
我在Unix操作系统中有一个进程(在我的例子中是Ubuntu)。我一辈子都不明白这是怎么回事。我知道
fork()
函数将我的程序分成两个进程,但从哪里开始?它是否创建了一个新进程并再次运行整个主函数,如果是,为什么
init()
只运行一次,而
printf()运行两次


为什么
printf(“pre-fork()”)运行两次,而
init()
函数只运行一次?

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

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

试试这个:

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

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

哇,这太微妙了+从我这里得到1分!简单地放入换行符并不一定会刷新缓冲区。在将stdout重定向到常规文件的情况下运行代码,您将看到完全相同的行为。默认情况下,标准输出不是行缓冲的,除非它是tty。@williampersell完全正确。即使目标是tty,标准也不能保证
\n
会触发刷新。这是否回答了您的问题@Nateeldge 9年前我接受的答案回答了我的问题:P但是thx,我想:P对于噪音,我只是想标记一些重复的问题。
printf("pre fork()\n");
fflush(stdout);