一、僵尸进程产生原因
一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。
二、僵尸进程解决办法
-
通过信号机制
子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程。 -
fork两次
父进程创建子进程A,子进程A再创建子进程B,然后子进程A退出,z这样子进程B就交给init进程处理了。init进程可以处理僵尸进程。 -
fork函数
fork是用来创建子进程的,这个函数的特别之处在于一次调用,两次返回,一次返回到父进程中,一次返回到子进程中,我们可以通过返回值来判断其返回点:
pid_t child = fork(); if( child < 0 ) { //fork error. perror("fork process fail.\n"); } else if( child ==0 ) { // in child process printf(" fork succ, this run in child process\n "); } else { // in parent process printf(" this run in parent process\n "); }
三、ps指令查看僵尸进程
ps -A -ostat,pid,cmd |grep -iE '^z'
-A 显示所有任务
-o 按照指定格式输出
grep -iE 显示z开头的行,不区分大小写