死Linux的解决方案

死Linux的解决方案

一个进程结束自己的生命时调用退出命令,但它并没有真正被销毁,而是留下一个进程叫死(僵尸)数据结构(退出系统调用,它是角色的过程,但只限于一个正常进程变成一个僵尸,并且不能完全销毁)。

僵尸

当每个进程退出时,内核释放进程的所有资源,包括打开的文件、占用的内存等,但仍然保留它的某些信息(包括进程号、进程ID、退出状态)。

进程的终止状态、运行时间、CPU占用的时间、CPU等等,直到父进程通过转到释放。当进程处于死进程状态时变成僵尸(僵尸进程)。这确保父进程可以在子进程结束时获得状态信息。

在Linux进程状态,僵尸是非常特殊的,它已经放弃了几乎所有的内存空间,没有可执行代码,不能简单的调度,保持在进程列表中的位置,记录该进程的退出状态信息收集等过程,此外,死亡的过程不再是占用内存空间。它要求其母为它收尸,如果他的父母没有安装等待或waitpid的SIGCHLD信号处理函数(调用)等待子进程结束,并没有明确地忽略该信号,从而保持死亡状态,如果父进程结束,刚死去的孩子进程成为孤儿过继给1号进程init进程,init总是清理僵尸,它生产也消失(当每个过程结束,系统会扫描所有流程,操作系统当前是否有过程,过程就是过程,最后如果是的,这是成为父母的init接管他,但是如果父进程)。是一个循环,不会结束,那么子进程将保持死亡状态,这就是为什么有时系统有很多僵尸。如何检查一个僵尸,使用ps命令,你可以看到一个明显的Z的过程是一个僵尸。

危害二,死亡过程

如果家长不呼叫等待/ waitpid,使信息保留不释放,这个过程会占用,但系统可以使用过程是有限的,如果大量死亡的过程中,因为没有可用的过程不能引起系统产生一个新的过程。

三,避免死进程

1。父进程结束了等待和waitpid等功能,这将导致父进程挂起。

2。如果父进程是非常繁忙的,你可以使用信号功能安装SIGCHLD信号处理函数。子进程结束后,父进程接收到该信号,可以在信号处理函数等待恢复。

3、如果父进程不关心时,子进程结束,然后通知内核(SIGCHLD信号,sig_ign),而不是在子进程结束感兴趣。在子进程完成后,内核将恢复,不再向父进程发送信号。

或通过设置SIGCHLD sa_nocldwait的sigaction功能,这一过程的结束,它不会进入死亡状态

结构sigaction隐形刺客;

sa.sa_handler = sig_ign;

sa.sa_flags = sa_nocldwait;

sigemptyset(SA。sa_mask);

sigaction(SIGCHLD,SA,null);

4、叉两次,父进程叉是一个子进程,然后继续工作,子进程分叉,孙子进程退出,然后Sun进程由init接管,在Sun进程结束后,init将被恢复,但是子进程的恢复也由父进程完成。

int nSTATUS;

pid_t PID;

PID =(vfork); / /生成过程

如果(PID > 0)父/父

{






Waitpid(PID,nSTATUS,0); / /等待子进程结束,否则这个过程会变成僵尸,一直存在,即使过程执行完后

}

否则如果(0 = PID)/子进程

{

PID =(vfork); / /孙晋城

如果(PID > 0)

{

出口(0);子进程退出进程,Sun接受init进程,退出状态也由init进程处理,与原始父}无关。

否则如果(PID = 0)晋城

{

如果(execlp(ls

{

perror(execlp );

出口(- 1);

}

}

其他的

{

perror(vfork(孩子));

}

}

其他的

{

perror(vfork(母));

}

}