QNX 6.6下定时器发送SIGUSR1信号未接收问题求助
问题分析与解决方案
从你提供的代码来看,最可能导致SIGUSR1定时器信号无法接收的原因是timer2的首次触发时间配置错误,导致定时器根本没有激活。
核心问题:timer2的it_value设置为0
在startTimer()函数中,你对timer2的配置是:
ts.it_value.tv_sec = 0; ts.it_value.tv_nsec = 0; ts.it_interval.tv_sec = TIMER2_INTERVAL_SEC; // this is 60 ts.it_interval.tv_nsec = 0;
根据POSIX标准(QNX 6.6遵循POSIX 1003.1),当itimerspec的it_value字段的tv_sec和tv_nsec都为0时,调用timer_settime()会停止定时器,即使it_interval有值也不会生效。这意味着timer2从未被激活,自然不会发送SIGUSR1信号。
而对比timerTS的配置:
ts.it_value.tv_sec = timestampInterval; // this is usually 60 ts.it_value.tv_nsec = 0; ts.it_interval.tv_sec = timestampInterval;
它的it_value设置了有效值,所以定时器会在60秒后首次触发,之后按间隔循环发送SIGUSR2。
修复方法
将timer2的it_value设置为与it_interval相同的值,或者你需要的首次触发时间:
// 修改timer2的启动配置 ts.it_value.tv_sec = TIMER2_INTERVAL_SEC; // 首次触发等待60秒 ts.it_value.tv_nsec = 0; ts.it_interval.tv_sec = TIMER2_INTERVAL_SEC; ts.it_interval.tv_nsec = 0;
如果需要定时器立即触发第一次,可以把it_value设置为0秒1纳秒(不能全为0):
ts.it_value.tv_sec = 0; ts.it_value.tv_nsec = 1; ts.it_interval.tv_sec = TIMER2_INTERVAL_SEC; ts.it_interval.tv_nsec = 0;
其他可能的排查点
如果修复上述问题后仍无法接收SIGUSR1,你可以检查以下内容:
- timer2变量的作用域:确保
timer2是全局变量或者在setupTimer()和startTimer()中都能正确访问的变量,避免因局部变量销毁导致定时器句柄失效。 - QNX定时器的优先级设置:虽然你设置了
ev2.sigev_priority = getprio(0);,但可以尝试显式设置一个合理的优先级值(比如高于默认值),避免信号被系统低优先级任务阻塞。 - 信号处理的重入问题:虽然手动发送SIGUSR1能正常处理,但可以检查信号处理函数中是否有耗时操作,导致后续信号被掩码阻塞。不过你的
sa_mask已经屏蔽了SIGUSR1和SIGUSR2,这部分是符合规范的。
内容的提问来源于stack exchange,提问作者user9331066
相关产品推荐
相关产品推荐

