子进程结束时,OS回向父进程发送一个SIGCHILD信号,关于信号会在下一个课程讲解,
父进程调用wait阻塞,wait是阻塞式的,父进程调用wait会被阻塞住,父进程调用wait就会一直在这里等SIGCHILD信号,收到这个信号就说明父进程要去回收僵尸进程了
所以说父子进程是异步的,同步,两个任务在同样的节拍下工作,中断就是异步的,我永远不知道别人是什么状态的,父进程要尽快的回收子进程,所以这个发信号的机制,就是为了解决父子进程之间的异步通信问题,就是让父进程快速回收僵尸子进程。
这是利用信号,使两个异步进程互相通信。
如果父进程没有任何子进程,如果父进程调用wait就会返回错误。父进程不能调用wait,这个机制是很合理的。
status是返回的子进程的结束状态
子进程的结束状态:子进程结束时会有一个返回值,是执行成功了还是失败了,status就知道了子进程是正常结束的还是异常结束的,异常包括Ctrl+c被别人kill的,status的意义就在这,父进程知道子进程挂掉时的状态
PID是进程号,子进程的ID号码,因为一个进程可能会有很多子进程,以示区分,wait阻塞等待,直到有一个子进程返回,因为先结束的哪一个是不知道的,要通过PID告诉父进程
总结:wait主要是用来回收子进程的资源,回收的同时还可以知道子进程的PID和退出状态
wait会交出CPU的使用权,只是在本进程中不会再往下执行了,本进程会卡在这里不往下执行
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid = -1,ret = -1;
int status = -1;
pid = fork();
if(pid < 0)//出错
{
perror("fork");
return -1;
}
else if(pid > 0)//父进程
{
printf("parent.child PID is %d.\n", pid);//在父进程中取子进程的PID
ret = wait(&status);
printf("child was stopped.child PID is %d.\n", ret);
printf("Returns true if the child terminated normally :%d\n", WIFEXITED(status));
printf("Returns true if the child process was terminated by a signal. :%d\n", WIFSIGNALED(status));
printf("returns the exit status of the child :%d\n", WEXITSTATUS(status));
}
else// == 0 子进程
{
printf("child.child PID is %d.\n", getpid());//在子进程中,取本进程的PID
return 88;
}
return 0;
}