运行以下命令时,sigwait()永远不会处理SIGUSR1
信号。基本设置是:main产生两个pthread:一个是处理程序线程,一个是工作线程。主线程和两个派生线程均阻塞SIGUSR1。工人在两次延迟时间内将SIGUSR1举起两次。处理程序线程永远看不到它。
这是在MacOS上。从Xcode运行时,我插入了一个执行pro hand -p true -s false SIGUSR1
的连续断点。如果我从命令行运行可执行文件,则会出现相同的输出。
为什么sigwait()
看不到凸起的SIGUSR1?
以下是输出:
SigHandlerThread: Waiting: 30
Raise
Raise
Program ended with exit code: 0
代码如下:
//
// Signal Test
//
typedef void* (*ThreadRoutine) (void*); // pthread_create
void workerRaise (int signum) {
sleep (2);
printf ("Raise\n");
raise (signum);
}
void sigBlock (sigset_t *set, int signum) {
sigemptyset(set);
sigaddset(set, signum);
pthread_sigmask(SIG_BLOCK, set, NULL);
}
void *sigHandlerThread (void *ignore) {
int signal;
sigset_t blockSignalSet;
sigBlock(&blockSignalSet, SIGUSR1);
printf ("SigHandlerThread: Waiting: %d\n", SIGUSR1);
while (0 == sigwait(&blockSignalSet, &signal))
printf ("SigHandlerThread: %d\n", signal);
printf ("SigHandlerThread: Exit (0 != sigwait())\n");
return NULL;
}
void *workerThread (void *ignore) {
sigset_t blockSignalSet;
sigBlock(&blockSignalSet, SIGUSR1);
workerRaise(SIGUSR1);
workerRaise(SIGUSR1);
pthread_exit(NULL);
}
// Called from main.
void testSignal () {
sigset_t blockSignalSet;
sigBlock(&blockSignalSet, SIGUSR1);
pthread_t worker, handler;
pthread_create (&handler, NULL, (ThreadRoutine) sigHandlerThread, NULL);
pthread_create (&worker, NULL, (ThreadRoutine) workerThread, NULL);
pthread_join(worker, NULL);
sleep (2);
}
答案 0 :(得分:1)
raise()
函数发送专门针对调用线程的信号-进程中的其他线程将不会接收到该信号。 raise(signum)
等同于pthread_kill(pthread_self(), signum)
。
您需要的是过程控制信号,而不是线程控制信号。代替使用raise(signum)
,而使用kill(getpid(), signum)
。