1、父进程wait回收子进程
1.1、wait的工作原理 (1)子进程结束时,系统向父进程发送SIGCHILD信号 (2)父进程调用wait函数后阻塞 (3)父进程被SIGCHILD信号唤醒然后去回收僵尸子进程 (4)父子进程之间是异步的,SIGCHILD信号机制就是为了解决父子进程之间的异步通信问题,让父进程可以及时的去回收僵尸子进程 (5)若父进程没有任何子进程,则wait返回错误 1.2、wait实战 (1)wait的参数status。status用来返回子进程结束时的状态,父进程通过wait得到status后就可以知道子进程的一些结束状态信息。 (2)wait的返回值pid_t。这个返回值就是本次wait回收的子进程ID,当前进程有可能有多个子进程,wait函数阻塞直到其中一个子进程结束wait就会返回,通过wait返回值,就可以用来判断到底是哪一个子进程本次被回收了。 注:wait主要是用来回收子进程资源,回收同时还可以得知被回收子进程的pid和退出状态 (3)fork后wait回收实例
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
pid_t pid = -1;
pid_t ret = -1;
int status = -1;
pid = fork();
if(pid > 0)
{
printf("parent.\n");
sleep(1);
ret = wait(&status);
printf("子进程已经被回收,子进程pid = %d.\n", ret);
printf("子进程是否正常退出:%d.\n", WIFEXITED(status));
printf("子进程是否非正常退出:%d.\n", WIFSIGNALED(status));
printf("正常终止的终止值是:%d.\n", WEXITSTATUS(status));
}
else if(pid == 0)
{
printf("child pid = %d.\n", getpid());
return 666;
}
else
{
perror("fork");
return -1;
}
return 0;
}
(4)WIFEXITED、WIFSIGNALED、WEXITSTATUS这几个宏用来获取子进程的退出状态。 WIFEXITED宏用来判断子进程是否正常终止(return、exit、_exit) WIFSIGNALED宏用来判断子进程是否非正常终止(被信号所终止) WEXITSTATUS宏用来得到正常终止情况下的返回值
|