死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(母));
}
}