标签:c-3 linux process signals c99
事实证明,我们可以通过指定由sigaction()忽略的SIGCHLD信号来阻止出现僵尸进程(即父进程不等待()使用_exit()).但是,无论如何,似乎默认会忽略SIGCHLD.这怎么工作?
int main (void) {
struct sigaction sa;
sa.sa_handler = SIG_IGN; //handle signal by ignoring
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGCHLD, &sa, 0) == -1) {
perror(0);
exit(1);
}
int pid = fork();
if (pid == 0) { //child process
_exit(0);
}
do_something(); //parent process
return 0;
}
最佳答案:
SIGCHLD的默认行为是丢弃信号,但子进程保留为僵尸,直到父进程调用wait()(或变量)以获得其终止状态.
但是如果你明确地使用处置SIG_IGN调用sigaction(),那么它会导致它不会将孩子变成僵尸 – 当孩子退出它时会立即获得.见https://stackoverflow.com/a/7171836/1491895
获取此行为的POSIX方法是使用handler = SIG_DFL和包含SA_NOCLDWAIT的标志调用sigaction.这是2.6以来的Linux.
标签:c-3,linux,process,signals,c99 来源: https://codeday.me/bug/20190516/1114681.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。