【问题标题】:Delivery of signal to mulitithreaded program with sigmask使用 sigmask 向多线程程序传递信号
【发布时间】:2013-10-26 10:56:14
【问题描述】:

如果我有一个程序有 N 正在运行的线程,并且其中的 N-1 使用 pthread_sigmask 阻止了 SIGUSR1 信号的传递:

int rc;
sigset_t signal_mask;
sigemptyset(&signal_mask);
sigaddset(&signal_mask, SIGUSR1);
rc = pthread_sigmask(SIG_BLOCK, &signal_mask, NULL);
if (rc != 0) {
  // handle error
}

当操作系统(Linux,最近的内核)将 SIGUSR1 传递给进程时,它是否保证传递给未阻塞的线程?或者它是否可以,例如,尝试一些被阻塞线程的子集然后放弃?

【问题讨论】:

  • AFAIK 你没有这样的保证....
  • OTOH 我不知道这不能保证。毕竟,这是向特定线程传递信号的正确方法。

标签: linux multithreading pthreads signals


【解决方案1】:

是的,可以保证进程导向的信号将被传递到已解除阻塞的线程之一(如果有的话)。来自 POSIX Signal Generation and Delivery 的相关引用:

为流程生成的信号应准确传送到其中一个 进程中的那些线程正在调用sigwait() 功能选择该信号或​​没有阻止传递 信号。

【讨论】:

    最近更新 更多