子进程退出时,父进程若不作处理就会造成僵尸进程的问题。所以子进程运行完成,需要知道它的结果是对是错,亦或是有没有正常退出。
父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息
wait()函数:
wait函数一旦调用,就会将自己阻塞,并开始监控并等待当前进程的子进程,在子进程退出时返回。
wait的一个参数 int* status 是一个输出型参数,用来获取子进程的退出状态,可以置为NULL不考虑子进程的退出状态。
#include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/wait.h>
5
6 int main()
7 {
8 int ret = fork();
9 if(ret==0)
10 {
11 //child
12 printf("child running/n");
13 sleep(100);
14 exit(0);
15 }
16 else
17 {
18 //father
19 wait(NULL);
20 printf("father running");
21 }
22 }
这里的代码让子进程等待100秒,以便于我们观察当前的各进程的状态。
通过查看进程
可以看到当前父进程的状态是等待状态。
关于status参数的输出
- 正常退出
- 异常退出(通过信号截断)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/wait.h>
5
6 int main()
7 {
8 int ret = fork();
9 if(ret==0)
10 {
11 //child
12 printf("child running\n");
13 sleep(3);
14 exit(88);
15 }
16 else
17 {
18 //father
19 int status;
20 wait(&status);
21 printf("the status is '%d'\n",(status>>8)&0xff);
22 printf("father running\n");
23 }
24 }
子进程退出码为88
waitpid()函数:
waitpid(pid_t pid,int* status,int option)
参数:
- pid:
- 负1:等待任意进程
- 输入pid,等待当前输入pid的进程 - stauts:
- 同wait的status - option:
- 0:以阻塞方式
- WNOHANG:非阻塞方式
需要注意的是 如果选用非阻塞方式,父进程不会阻塞等待,而是直接返回,有可能导致僵尸进程的方式,所以一般配合while使用,非阻塞的返回是0
while(waitpid(-1,NULL,WNOHANG)==0)