Linux下的僵尸进程

来源:互联网 发布:什么是网络架构 编辑:程序博客网 时间:2024/04/30 20:17

先简单说说Linux下的进程的状态
⼀个进程可以有⼏个状态(在Linux内核⾥,进程有时候也叫做任务)
下⾯的状态在 fs/proc/array.c ⽂件⾥定义:
/*
* The task state array is a strange “bitmap” of
* reasons to sleep. Thus “running” is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
“R (running)”, /* 0 */
“S (sleeping)”, /* 1 */
“D (disk sleep)”, /* 2 */
“T (stopped)”, /* 4 */
“t (tracing stop)”, /* 8 */
“X (dead)”, /* 16 */
“Z (zombie)”, /* 32 */
};

R——处于运行状态,可能会被CPU执行
S——常规睡眠,可被其他进程唤醒
D——深度睡眠,不会被中断(想要杀死这种进程可以关机或者等进程自己启动),用于保证数据读取(IO)等完整
T——暂停状态
X——退出状态,资源将被回收
Z——僵尸状态,正在提取退出原因,由父进程处理,不及时处理会造成资源浪费

僵⼫进程:⼀个⼦进程在其⽗进程没有调⽤wait()或waitpid()的情况下退出。这个⼦进程就
是僵⼫进程。如果其⽗进程还存在⽽⼀直不调⽤wait,则该僵⼫进程将⽆法回收,等到其⽗
进程退出后该进程将被init(进程号为1)回收。

可以先模拟实现一个僵尸进程:
这里写图片描述

运行的结果为:

这里写图片描述

如何清理掉僵尸进程:

1.一般僵尸进程很难直接kill掉,不过您可以kill僵尸爸爸。父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。

2.父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。

3.如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父进程会收到该信号,可以在handler中调用wait回收。

4.最为简单粗暴的就是关机重启。

0 0
原创粉丝点击