标签:void 函数代码 test 补充 执行 方式 this get \n
前面的进程控制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\n",getpid());
_exit(0);
}
else
{
printf("this is a parent:%d\n",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\n",getpid());
_exit(0);
}
else
{
//父进程忽略SIGCHLD
signal(SIGCHLD,SIG_IGN);
printf("this is a parent:%d\n",getpid());
while(1);
}
}
捕获SIGCHLD信号方式:
void func(int sig)
{
printf("receive signal:%s[%d]\n",strsignal(sig),sig);
wait(NULL);
}
void testZomb()
{
pid_t pid=fork();
if(pid==0)
{
printf("this is a child:%d\n",getpid());
_exit(0);
}
else
{
//父进程对SIGCHLD进行处理
signal(SIGCHLD,func);
printf("this is a parent:%d\n",getpid());
while(1);
}
}
wait结束后,由init释放进程资源表。
标签:void 函数代码 test 补充 执行 方式 this get \n
原文地址:https://www.cnblogs.com/gd-luojialin/p/9216000.html