fork进程的执行

Execution of fork processes

谁将执行 printf 行(所有进程完成后的初始进程或每个进程)?

#include<stdio.h> 
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    for(int i=0;i<3;i++) 
    {
        fork();
    }
    while(wait(NULL)>0);
    printf("finished\n");
}

全部。从代码中可以直接看出。在任何创建的 child 中都不会调用 exit() 并且它们可以自由执行 parent 执行的内容。所以每个child执行一次printf()。这可以通过编程方式验证如下:

#include<stdio.h> 
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{

        printf("PID = %d\n", getpid());
        for(int i=0;i<3;i++) 
         {
                if (fork() == 0)
                        printf("PID = %d\n", getpid());
         }
        while(wait(NULL)>0);
        printf("PID: %d finished\n", getpid());
}

输出

$ ./a.out 
PID = 120360
PID = 120361
PID = 120362
PID = 120364
PID = 120363
PID = 120366
PID: 120363 finished
PID: 120366 finished
PID = 120367
PID = 120365
PID: 120367 finished
PID: 120365 finished
PID: 120362 finished
PID: 120364 finished
PID: 120361 finished
PID: 120360 finished

从上面的输出可以看出,每个创建的child都在执行printf()一次