网站开发哈尔滨网站开发公司,津南区提供网站建设协议,wordpress 图标不显示,电子商务网站建设过程报告分析Android系统启动过程的时候#xff0c;init进程调用 signal_handler_init 函数用于设置子进程信号处理函数#xff0c;它被定义在 system/core/init/signal_handler.cpp中#xff0c;主要用于防止init的子进程成为僵尸进程#xff0c;看到这里有个名词要解释一下#…分析Android系统启动过程的时候init进程调用 signal_handler_init 函数用于设置子进程信号处理函数它被定义在 system/core/init/signal_handler.cpp中主要用于防止init的子进程成为僵尸进程看到这里有个名词要解释一下什么是僵尸进程看到一篇文章写的不错转载一下原文链接http://www.nowamagic.net/librarys/veda/detail/1994
什么是僵尸进程 Zombie Process
僵尸进程是指一个已经终止、但是其父进程尚未对其进行善后处理获取终止进程的有关信息的进程这个进程被称为“僵尸进程”(zombie)。
怎样产生僵尸进程
一个进程在调用exit命令结束自己的生命的时候其实它并没有真正的被销毁而是留下一个称为僵尸进程Zombie的数据结构系统调用exit 它的作用是使进程退出但也仅仅限于将一个正常的进程变成一个僵尸进程并不能将其完全销毁。
在Linux进程的状态中僵尸进程是非常特殊的一种它已经放弃了几乎所有内存空间没有任何可执行代码也不能被调度仅仅在进程列表中保留一个位 置记载该进程的退出状态等信息供其他进程收集。除此之外僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸如果他的父进程没安装 SIGCHLD 信号处理函数调用wait或waitpid()等待子进程结束又没有显式忽略该信号那么它就一直保持僵尸状态如果这时父进程结束了 那么init进程自动会接手这个子进程为它收尸它还是能被清除的。但是如果如果父进程是一个循环不会结束那么子进程就会一直保持僵尸状态这就是 为什么系统中有时会有很多的僵尸进程。
怎么查看僵尸进程
利用命令ps可以看到有父进程ID为1的进程是孤儿进程s(state)状态为Z的是僵尸进程。
注意孤儿进程(orphan process)是尚未终止但已停止(相当于前台挂起)的进程但其父进程已经终止由init收养而僵尸进程则是已终止的进程其父进程不一定终止。
怎样来清除僵尸进程
1.改写父进程在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后 会发送SIGCHLD信号给父进程父进程收到此信号后执行 waitpid()函数为子进程收尸。这是基于这样的原理就算父进程没有调用wait内核也会向它发送SIGCHLD消息尽管对的默认处理是忽略 如果想响应这个消息可以设置一个处理函数。 2.把父进程杀掉。父进程死后僵尸进程成为孤儿进程过继给1号进程initinit始终会负责清理僵尸进程关机或重启后所有僵尸进程都会消失。
避免产生僵尸进程的方法
1.在SVR4中如果调用signal或sigset将SIGCHLD的配置设置为忽略,则不会产生僵死子进程。另外,使用SVR4版的 sigaction,则可设置SA_NOCLDWAIT标志以避免子进程僵死。 Linux中也可使用这个在一个程序的开始调用这个函数signal(SIGCHLD,SIG_IGN)。 2.调用fork两次。 3.用waitpid等待子进程返回