当一个进程结束时,产生一个终止状态字,然后系统和新发一个SIGCHILD信号通知父进程。因为子进程结束是异步与父进程的,故父进程结束之前,要同步等待子进程终止。这是系统通过调用wait或waitpid来实现的。
当父进程通过调用wait或waitpid同步等待子进程结束时,可能有以下几种情况:
①如果子进程还未结束,父进程阻塞等待
②如果子进程已经结束,其终止状态字SIGCHILD放在指定位置等待父进程提取,这时,父进程可立即得到终止状态字并返回
③如果没有子进程,父进程立即错误返回。
系统调用wait()实例
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
int child;
if((child = fork()) == 0)
{
printf("child PID is %d\n",getpid());
exit(0);
}
printf("child PID to return to parent is %d\n",child);
wait(0);
return 0;
}
父子进程之间的同步之例
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
int pid1;
if(pid1 = fork())
{
if(fork())
{
printf("parents context\n");
printf("parent is waitting the child1 terminate\n");
wait(0);
printf("parent is waitting the child2 terminate\n")
wait(0);
printf("parent terminate\n");
exit(0);
}
else
printf("child2 context\n");
sleep(5);
printf("child2 terminate\n");
exit(0);
}
else
{
if(pid1 == 0)
{
printf("child context\n");
sleep(10);
printf("child terminate\n");
exit(0);
}
}
return 0;
}
上述程序是父进程首先创建一个子进程,若成功,再创建另一个子进程,之后三个进程并发进行。究竟谁先运行,是随机的,下图是其中一个结果