父进程是init一定不会变僵尸进程吗?
来源:互联网 发布:删除表数据 truncate 编辑:程序博客网 时间:2024/06/10 18:40
工作中有次操作线上环境时发现有一个“Z”(僵尸)进程,当时首先想到的方法就是把这个进程的父进程干掉。但是ps下发现该进程的父进程已经是init了。这个情况让我很迷惑,因为通常来说一旦init进程接管了Z状态的进程就会调用wait将其回收。而且这是避免僵尸进程的一种重要手段,怎么会出现这种情况呢?
后来仔细回想了下进程终止时的过程,忽然找到问题所在了。我们知道任何进程结束最终都会调用内核函数do_exit。而这个函数有两个重要的事要完成:
(1)(作为父进程)给自己的子进程(如果存在)找一个新的父进程;
(2)(作为子进程)通知自己的父进程为自己“收尸”;
第一个事情比较简单,如果要退出的进程时多线程进程,则可以将子进程托付给自己的兄弟线程,如果没有这样的线程,则托付给init进程;
第二件事情对于单线程的进程比较简单,但多线程的进程就会复杂些。因为只有线程组的主线程才有资格通知父进程,线程组的其他线程终止时,并不通知父进程,也没必要保留资源进入僵尸状态,直接调用release_task函数释放所有的资源就好。
由于父进程只认子进程的主线程,所以在线程组中,如果主线程终止了,但是线程组还有其他线程,那么就不会通知父进程来收尸,直到线程组中最后一个线程退出时。换句话说:在用户层面,可以调用pthread_exit让主线程先“死”,但在内核态中,主线程的task_struct一定要保住,哪怕变为僵尸。
所以当主线程退出但是其他线程还在运行,这时主线程就会变为Z状态,纵使init接管了主线程。
18099 1 Zsl a.out 0.0 0.0
可以看到,虽然init接管了主线程,但是主线程依然是Z状态。要想让这个Z进程消失,有两个办法,一个是杀死整个进程,也就是kill 18099,在一个就是ps -eLf查找其他线程,然后kill掉。
后来仔细回想了下进程终止时的过程,忽然找到问题所在了。我们知道任何进程结束最终都会调用内核函数do_exit。而这个函数有两个重要的事要完成:
(1)(作为父进程)给自己的子进程(如果存在)找一个新的父进程;
(2)(作为子进程)通知自己的父进程为自己“收尸”;
第一个事情比较简单,如果要退出的进程时多线程进程,则可以将子进程托付给自己的兄弟线程,如果没有这样的线程,则托付给init进程;
第二件事情对于单线程的进程比较简单,但多线程的进程就会复杂些。因为只有线程组的主线程才有资格通知父进程,线程组的其他线程终止时,并不通知父进程,也没必要保留资源进入僵尸状态,直接调用release_task函数释放所有的资源就好。
由于父进程只认子进程的主线程,所以在线程组中,如果主线程终止了,但是线程组还有其他线程,那么就不会通知父进程来收尸,直到线程组中最后一个线程退出时。换句话说:在用户层面,可以调用pthread_exit让主线程先“死”,但在内核态中,主线程的task_struct一定要保住,哪怕变为僵尸。
所以当主线程退出但是其他线程还在运行,这时主线程就会变为Z状态,纵使init接管了主线程。
l 测试代码
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <pthread.h>void thread_fun(void){ printf("begin thread...\n"); sleep(100); printf("end thread...\n");}int main(int argc, char *argv[]){ pthread_t tid; int ret; daemon(0, 0);//调用deamon是为了让init接管主线程 printf("process begin...\n"); ret=pthread_create(&tid,NULL,(void *)thread_fun,NULL); if(ret !=0 ) { printf("pthread error\n"); exit(1); } printf("main thread is end...\n"); pthread_exit(0); printf("never exce\n");}我们创建线程执行sleep,然后主线程退出,当我们使用ps查看主线程状态时结果如下:
18099 1 Zsl a.out 0.0 0.0
可以看到,虽然init接管了主线程,但是主线程依然是Z状态。要想让这个Z进程消失,有两个办法,一个是杀死整个进程,也就是kill 18099,在一个就是ps -eLf查找其他线程,然后kill掉。
0 0
- 父进程是init一定不会变僵尸进程吗?
- 父进程是init一定不会变僵尸进程吗?
- [李景山php] 关于父进程 僵尸进程 init 进程
- 僵尸进程,孤儿进程是如何产生
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 利用自动索引计算数组元素的平方和
- 线段树模板
- 递推最小二乘辨识平面双机械臂Matlab代码
- hdu 5009 Paint Pearls(DP+链表优化)
- 列类型
- 父进程是init一定不会变僵尸进程吗?
- 分类(Classification):Probability Generative Model
- JS级联菜单
- CentOS 配置LAMP(Apache+MySQL+PHP)环境,并配置phpmyadmin
- 题目1113:二叉树 九度OJ
- 自定义控件(31)---贝塞尔曲线
- JSP四大作用域和跳转、重定向
- Servlet实现文件下载详解与实例
- 漫步数理统计十四——重要的不等式