是否可以将linux定时器通知信号指向特定的线程?

时间:2014-10-30 15:59:17

标签: c linux multithreading timer posix

我想使用Linux POSIX计时器API在我的系统中实现计时器处理模块。 用户可以启动计时器,并进行回调。 调用的调用将从一个线程完成(而不是从信号处理程序)。

我正在考虑使用SIGEV_SIGNAL设置timer_create(),并使用sigwaitinfo()等待信号的线程(信号arg将给出将调用所需回调的timerId)

如何在linux内核中路由信号?我需要指定发送哪个线程吗?

1 个答案:

答案 0 :(得分:2)

默认情况下,信号可以传递到任何线程,您不应该对哪一个进行假设。但是,Posix线程可以为您提供一些控制权。您通常会将SIGALRM与计时器结合使用,但我有一个SIGHUP示例,因此我将在此处展示它以演示工作流程。

当您的应用程序启动时,主线程会设置要忽略的信号的全局处置:

int    n;
sigset_t    set;    
struct sigaction disp;

bzero(&disp, sizeof(disp));
disp.sa_handler = SIG_IGN;
if (sigaction(SIGHUP, &disp, NULL) < 0) {
 syslog(LOG_CRIT, "sigaction_main: %m");
 _exit(1);
}

接下来,确保新生成的线程将继承的掩码也阻止此信号:

sigemptyset(&set);
sigaddset(&set, SIGHUP);
if ( (errno = pthread_sigmask(SIG_BLOCK, &set, NULL)) != 0) {
 syslog(LOG_CRIT, "sigmask_main: %m");
 _exit(1);
}

此时,您生成了所有不应被信号(HUP)中断的线程。完成所有操作后,主线程进入信号等待和处理的专用模式:

for (; ;) {
 if ( (errno = sigwait(&set, &n)) != 0) {
  syslog(LOG_CRIT, "sigwait_main: %m");
  _exit(1);
 }
 if (n == SIGHUP) {
  /* do the errands */
 }
}