僵尸进程(Z状态)无法被kill指令杀死,通过进程等待杀掉它,解决内存泄漏问题(进程处于僵尸态,仍然维护pcb结构体来解决问题)
通过进程等待,获得进程退出情况
wait回收僵尸态进程
我们可以看到进程由五秒后子进程从僵尸态销毁,wait可以杀掉僵尸态的进程
wait每次只能回收一个僵尸进程
循环等待回收多个僵尸态进程
阻塞等待
如果子进程不是僵尸态,父进程在调用wait()时会进入阻塞状态,等待子进程结束,这是软件的阻塞状态,等待外设输入,属于硬件的阻塞状态。
waitpid()
wait的int* status获取子进程退出信息
status作为输出型参数,相当于传入一个空间,进程结束后把子进程的信息放入status指向的空间
status保存的内容
//00000000 00000000 00000000 00000000
(只看后16位)
00000000 //前8位退出码
0 // 第8位 core dump
0000000//1到7位 终止信号
信号码表示进程是否正常终止,退出码表示进程结束后,退出信息(return 0,exit(0) 0为退出码)
有信号码表示进程因为除0或者野指针等错误,不能正常终止。被操作系统干掉。
非阻塞轮询:父进程多次访问子进程结束状态
pid_t waitpid(pid_t pid,int *status,int options)
options默认是0,默认情况下是阻塞方式,父进程会一直等待子进程,直到进程运行完。
当options的值是WNOHANG时,父进程不会阻塞,可以继续向下运行其他代码。
非阻塞轮询就是父进程不阻塞下在循环下多次间隔访问
waitpid的返回值大于0,等待正常,返回值小于0,等待失败(等待的进程不是父进程的子进程时)等于0,函数运行正常,但还没确定结果。