You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:32:08