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()
一次
谁将执行 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()
一次