Linux进程7.进程等待
01 什么是僵尸进程
僵尸进程就是已经结束了的,但是还没有从进程表中删除的进程。僵尸进程太多会导致进程表里面条目被填满,进而导致系统崩溃。
在进程的状态中,僵尸进程几乎放弃了所有的内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置。
他需要父进程来为它收尸,如果父进程没有安装SIGCHLD信号处理函数,调用wait()或者waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态。如果这时父进程结束了,那么init进程会自动接手这个子进程,为它收尸。
- 可以用top命令查看僵尸进程
- 继而使用ps -aux |grep Z命令来查看僵尸进程,僵尸进程的状态显示的是Z
- 杀死僵尸进程
kill命令对僵尸进程不起作用,只能通过杀死僵尸进程的父进程来杀死它
ps - ef | grep 僵尸进程的PID
kill -9 僵尸进程的父进程
02 如何避免僵尸进程
- wait函数:用于等待子进程中断或结束
wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束为止。
- waitpid函数:用于等待子进程的中断或结束
waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束为止。
03 进程退出
在Linux中进程退出分为正常退出和异常退出;
- 正常退出:
1)在main函数中执行return;
2)调用exit函数;
3)调用_exit函数; - 异常退出
1)调用abort函数;
2)进程收到某个信号,而该信号使程序终止;
不管哪种退出方式,系统最终都会执行内核中的同一代码,这段代码用来关闭进程所用已打开的文件描述符,释放它所占的内存和其它资源。
- exit和return的区别:
exit是一个函数,有参数,exit执行完后把控制权交给系统;
return是函数执行完后的返回,return执行完后将控制权交给系统。
- exit和abort的区别:
exit是正常终止进程;
abort是异常终止程序。
- exit和_exit函数
exit和_exit函数都是用来终止进程的,当程序执行到exit和_exit时,系统无条件地停下所有的操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。
exit在头文件stdlib.h中声明,而_exit在头文件unistd.h中声明。