有没有办法阻止某些信号并解锁其他信号
同一套?
With pthread_sigmask
,您可以选择:
- 使用常量将一组信号添加到阻塞信号集中
SIG_BLOCK
- 使用常数将一组信号移除到一组被阻止的信号中
SIG_UNBLOCK
- 使用常量定义要阻止的信号集
SIG_SET
换句话说,线程有一组当前被阻止的信号,您可以按照上面指定的方式修改它,一次一个操作。
重要的一点是,新创建的线程继承创建线程的信号掩码,因此您可以在创建新线程之前或在新线程将运行的函数中根据需要设置新线程的掩码。
关于你的例子,我想你正在尝试printer_thread1
block SIGUSR2
and SIGALRM
,并且有printer_thread2
block SIGUSR1
and SIGALRM
,并且有主线程块SIGUSR1
and SIGUSR2
,这样每个线程都可以发送一个信号,该信号将被单个线程捕获(没有代码print
, f1
and f2
,不可能确切知道您在示例中的意图是什么)。
您应该能够通过以下代码来实现这一点:
sigset_t set;
pthread_t printer_thread1, printer_thread2;
// Block signal SIGUSR1 & SIGALRM in printer_thread1
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
sigaddset(&set, SIGALRM);
pthread_sigmask(SIG_SET, &set, NULL);
pthread_create(&printer_thread1, NULL, print, (void *)&f1);
// Block signal SIGUSR2 & SIGALRM in printer_thread2
sigaddset(&set, SIGUSR2);
sigaddset(&set, SIGALRM);
pthread_sigmask(SIG_SET, &set, NULL);
pthread_create(&printer_thread2, NULL, print, (void *)&f2);
// Block signal SIGUSR1 & SIGUSR2 in the main thread
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
sigaddset(&set, SIGUSR2);
// Listen to signal SIGALRM
pthread_sigmask(SIG_SET, &set, NULL);
bool tl = true;
while(1)
{
if(tl)
{
// thread1 does something
kill(pid, SIGUSR1);
// main thread waits for SIGALRM
sigwait(&set, &sig);
tl = !tl;
}
else
{
// thread2 does something
kill(pid, SIGUSR2);
// main thread waits for SIGALRM
sigwait(&set, &sig);
tl = !tl;
}
}
请参阅这些手册页:
- pthread_sigmask https://www.kernel.org/doc/man-pages/online/pages/man3/pthread_sigmask.3.html
- sigproc掩码 https://www.kernel.org/doc/man-pages/online/pages/man2/sigprocmask.2.html
了解更多详情。