我想使用Linux POSIX计时器API在我的系统中实现计时器处理模块。 用户可以启动计时器,并进行回调。 调用的调用将从一个线程完成(而不是从信号处理程序)。
我正在考虑使用SIGEV_SIGNAL设置timer_create(),并使用sigwaitinfo()等待信号的线程(信号arg将给出将调用所需回调的timerId)
如何在linux内核中路由信号?我需要指定发送哪个线程吗?
答案 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 */
}
}