两种特殊状态:
(1)孤儿进程:没有危害,不需要处理。
(2)僵尸态进程:占用pcb,要处理。即回收资源。
一、回收资源
1、wait
pid_t wait(int *wstatus)
功能:(1)获取子进程退出状态;(2)回收资源,会让僵尸态的子进程销毁。
wait本身是一个阻塞操作,会使调用者阻塞。调用进程,一般不做额外的事情。
父进程要获得子进程的退出状态:
(1)子进程
exit(退出状态值);只有最低8位有效,范围:【0~255】。
(2)父进程
wait(&status);获取到退出状态值。
WIFEXITED( ) 先判断是否正常退出;WEXITSTATUS( ) 获得退出状态值的原数字。
例如:正常退出时:
WIFSIGNALED( )先判断是否被一个信号结束;WTERMSIG( )获得被哪个信号结束的编号。
例如:异常结束时:
2、waitpid
pid_t waitpid(pid_t pid(1) , int *wstatus(2) , int options(3))
等待子进程状态发生变化。调用进程,逻辑一般不受影响。
(1) pid_t pid大于0时,表示等待指定pid号的子进程状态改变;等于-1时表示等待所有子进程。
(2)int *wstatus表示获取到的子进程状态信息。
(3)int options选项,①默认是阻塞时,传0;②可以不阻塞,传WNOHANG宏。
wait(&wstatus)<==等价于==> waitpid(-1 , &wstatus , 0);
注意:(1)阻塞:会影响父进程处理逻辑;
(2)非阻塞:父进程会去查看子进程状态改变,但如果没有发生变化,父进程不阻塞,整个程序继续往下。(必须套在循环中处理<轮询>)。
(3)wait是一种阻塞调用;waitpid可实现非阻塞调用。
例如:当子进程存在时,父进程处于非阻塞状态下,会与子进程一同进行,父进程也打印。
当子进程结束,程序结束,No child processes.