14僵尸进程方式3 4补充
Posted gd-luojialin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14僵尸进程方式3 4补充相关的知识,希望对你有一定的参考价值。
前面的进程控制2,介绍了僵尸进程,和解决方式4种中的两种。下面再补充两种。
解决方式:
3:忽略SIGCHLD信号
父进程设置忽略 SIGCHLD信号,子进程结束自动释放进程表资源
忽略SIGCHLD信号:
signal(SIGCHLD, SIG_IGN)
4:捕获SIGCHLD信号
父进程捕获SIGCHLD信号,并在捕获函数代码中 执行wait()
处理SIGCHLD信号:
void pFun(int nSignal)
signal(SIGCHIL, pFun)
僵尸进程:
void testZomb()
{
pid_t pid=fork();
if(pid==0)
{
printf("this is a child:%d ",getpid());
_exit(0);
}
else
{
printf("this is a parent:%d ",getpid());
while(1);
}
}
rowe 3440 3110 92 23:04 pts/0 00:00:08 ./main
rowe 3441 3440 0 23:04 pts/0 00:00:00 [main] <defunct>
<defunct>说明就是僵尸进程,并且无法使用kill命令进行终止,也无法对其进行任何操作。
忽略SIGCHLD信号方式:
void testZomb()
{
pid_t pid=fork();
if(pid==0)
{
printf("this is a child:%d ",getpid());
_exit(0);
}
else
{
//父进程忽略SIGCHLD
signal(SIGCHLD,SIG_IGN);
printf("this is a parent:%d ",getpid());
while(1);
}
}
捕获SIGCHLD信号方式:
void func(int sig)
{
printf("receive signal:%s[%d] ",strsignal(sig),sig);
wait(NULL);
}
void testZomb()
{
pid_t pid=fork();
if(pid==0)
{
printf("this is a child:%d ",getpid());
_exit(0);
}
else
{
//父进程对SIGCHLD进行处理
signal(SIGCHLD,func);
printf("this is a parent:%d ",getpid());
while(1);
}
}
wait结束后,由init释放进程资源表。
以上是关于14僵尸进程方式3 4补充的主要内容,如果未能解决你的问题,请参考以下文章