sigwait的奇怪行为

时间:2011-10-13 06:31:57

标签: c linux signals

我正在使用sigwait阻止我的线程获取某些信号。这些信号已添加到sig集中。根据doc sigwait的AS应该只等待传递给它的信号作为参数中的一个集合而不应该改变该线程的信号掩码..但由于某种原因我不知道,它正在改变信号掩码的线程。它阻止了除sigs之外的所有信号。我不希望这发生。 有人可以用同样的方式帮助我。 Thanx提前

代码段:

sigset_t sigs;
int sig_recvd;
sigset_t old_mask;
sigemptyset(&sigs);
sigaddset(&sigs, SIGUSR1);
sigaddset(&sigs, SIGTERM);
sigaddset(&sigs, SIGHUP);
sigaddset(&sigs, SIGINT);
sigaddset(&sigs, SIGPIPE);
sigaddset(&sigs, SIGCHLD);

sigprocmask(SIG_BLOCK, &sigs, &old_mask);

do
{

    sigwait(&sigs, &sig_recvd);
    //Switch for some signal handling

} while(1);
Sigblk在sigwait之前:0000000080014203
Sigblk在sigwait期间:fffffffefffabcfc


我不知道sigwait函数有什么问题,但是当我对sigwaitinfo做同样的事情时,事情对我来说很有用。无法弄清楚后来的工作是什么,但是现在我的问题已经解决了。但我想知道两者的实施是否有任何差异

2 个答案:

答案 0 :(得分:0)

我不太确定你的问题是什么,如果你的问题是“为什么sigwait在执行期间更改sigmast ,而不是执行之后”,那么它就是例如,sigwait会在执行时解锁信号,否则,它怎么能指望信号到来?这里摘自APUE: If one of the signals specified in the set is pending at the time sigwait is called, then sigwait will return without blocking. Before returning, sigwait removes the signal from the set of signals pending for the process. To avoid erroneous behavior, a thread must block the signals it is waiting for before calling sigwait. The sigwait function will atomically unblock the signals and wait until one is delivered. Before returning, sigwait will restore the thread's signal mask. If the signals are not blocked at the time that sigwait is called, then a timing window is opened up where one of the signals can be delivered to the thread before it completes its call to sigwait

答案 1 :(得分:0)

为什么不使用pthread_sigmask()而不是sigprocmask()