我有sigchld信号的处理程序,但是当sigtimedwait()返回未调用的成功处理程序时。为什么?

时间:2015-03-04 12:49:54

标签: c linux signal-handling

int exe(int sec)
{
const char *buf;
int timeout_sec=sec;
int i=0,j=0;
sigset_t mask;
sigset_t orig_mask;
sigset_t pset;
siginfo_t siginfo;
struct timespec timeout;
pid_t pid;
int fd,status=-1;
int fl;
sig_init();
sigemptyset (&mask);
sigaddset (&mask, SIGCHLD);

if (sigprocmask(SIG_BLOCK, &mask, &orig_mask) < 0) {
    perror ("sigprocmask");
    goto error;
}

if (( pid=fork())<0)
{
    perror ("fork");
    goto error;
}
else if (pid == 0)
{
    printf("In child pid=%d\n",getpid());
    if(execv(ptr[0],ptr)==-1)
    {
        printf("execv failed in %s: error: %s\n", __FUNCTION__, strerror(errno));
        _exit(1);
    }

    printf("Exiting child\n");
    _exit(0);

}
else
{
    timeout.tv_sec = timeout_sec;
    timeout.tv_nsec = 0;

do {
         if ((ss=sigtimedwait(&mask, &siginfo, &timeout)) < 0) {

            if (errno == EINTR) {
                // Interrupted by a signal other than SIGCHLD.
                printf("Continue\n");
                continue;
            }
            else if (errno == EAGAIN) {
               printf("%s %s failed in:%s KILLING\n",ptr[0],ptr[1],__FUNCTION__);
                kill (pid, SIGKILL);
            }
            else {
                perror ("sigtimedwait");
                goto error;
            }
        }

        break;
} while (1);
if (sigprocmask(SIG_SETMASK, &orig_mask, NULL) < 0) {
        perror ("sigprocmask");
        goto error;
    }
  sleep(10);

  }
return 0;
error:
printf("%s failed\n",__FUNCTION__);
return -1;
}

这里我试图阻止SIGCHLD和子进程执行execv,对于SIGCHLD状态我有一个处理程序(这里没有在代码中提到),当sigtimedwait()返回错误但sigtimedwait()时工作正常成功处理程序没有被调用,如果我直接在父而不是处理程序中使用waitpid,那么在两种情况下它都很好。 请帮帮我。我刚刚在sigtimedwait的man page中找到了一条线索,即&#34; sigwaitinfo()从调用进程的挂起信号列表中删除传递的信号,并返回信号编号作为其功能结果&#34; 很想知道原因和太多需要。谢谢:)

0 个答案:

没有答案