如何处理SIGCHLD用C [英] How can I handle sigchld in C

查看:434
本文介绍了如何处理SIGCHLD用C的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要妥善处理SIGCHLD。我如何使用它与我现有的code。此刻我不能等待子进程,除非我用0代替 WNOHANG的| WUNTRACED

i need to handle sigchld properly. How can I use it with my existing code. at the moment i cant wait for the child process unless i use 0 instead of WNOHANG|WUNTRACED.

status = 0; 
        pid_t child, endID;
        if(amp == 1)
                signal( SIGCHLD, SIG_IGN ); 

        child = fork(); 

        if (child  <  0) {    
                perror("fork() error\n");
                exit(EXIT_FAILURE);

        } else if (child == 0) { 
                // do sth here
                perror("error\n");

        } else { 
                //sleep(1)

如果我删除的睡眠,然后再执行父1。为什么?

if i remove sleep then parent is executed 1st.. why?

推荐答案

下面是一个开始(但低于读​​):

Here is a start (but read below):

static void
child_handler(int sig)
{
    pid_t pid;
    int status;

    /* EEEEXTEERMINAAATE! */
    while((pid = waitpid(-1, &status, WNOHANG)) > 0)
        ;
}

/* Establish handler. */
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = child_handler;

sigaction(SIGCHLD, &sa, NULL);


当然,这是所有的无谓。如果家长只是忽略 SIGCHLD ,孩子们都默默地收获并不会变成僵尸。


Of course, this is all pointless. If the parent simply ignores SIGCHLD, the children are silently reaped and won't turn into zombies.

引用TLPI:

设置明确SIGCHLD的配置为SIG_IGN导致任何
  子进程结束之后将立即删除
  从系统的而不是被转换成一个僵尸

Explicitly setting the disposition of SIGCHLD to SIG_IGN causes any child process that subsequently terminates to be immediately removed from the system instead of being converted into a zombie.

所以,这样的事情应该为你做的伎俩:

So something like this should do the trick for you:

signal(SIGCHLD, SIG_IGN); /* Silently (and portably) reap children. */

这篇关于如何处理SIGCHLD用C的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆