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; 很想知道原因和太多需要。谢谢:)