定时器和信号问题
我已经使用timer_create() API 实现了一个POSIX 计时器,当计时器到期时(我已经为其放置了处理程序代码),这将生成SIGUSR1。现在的问题是,如果这个程序收到另一个 SIGUSR1,那么相同的信号处理程序将被调用并捕获。
有什么方法可以防止这种情况,以便处理程序可以捕获仅由计时器生成的信号?
I have implemented a POSIX timer using timer_create( ) API, and this will generate SIGUSR1 when the timer expires for which i have put a handler code. Now the problem is, if this program receives another SIGUSR1, then the same signal handler will be invoked and caught.
Is there any way to prevent this, so that the handler can catch signals only generated by the timer?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这对你有用吗? (修改了
timer_create
手册页中示例的代码。)当捕获来自定时器的信号时,将显示
Caught signal 10 from timer
。否则会显示杂散信号
。Will this work for you? (Modified the code from example in
timer_create
man page.)When signal from timer is caught
Caught signal 10 from timer
will be displayed. OtherwiseStray signal
will be displayed.问题是你是否真的需要使用信号。您可能会考虑使用计时器到期时将调用的回调:
回调函数将在新线程中调用。
The question is whether you really need to use signals. You may think of using callback that will be called when the timer expires:
The callback function will be called in a new thread.
不,没有简单的方法。如果您有其他东西与计时器一起生成 SIGUSR1,为什么不使用 SIGUSR2 代替计时器呢?如果这还不够,请为您的应用程序使用实时信号之一。
如果它必须能够处理来自计时器和其他源的相同信号,那么根据速度、数量、系统等,您可以尝试在注册计时器之前设置一个时间戳,了解计时器大约退出的时间,然后在信号处理程序中尝试推断它是否在时间裕度内。我强烈建议不要使用这种方法,而是重新设计你正在做的事情。
No, there is no easy way. Why don't you use SIGUSR2 instead for your timers if you have something else generating SIGUSR1 together with your timer. If that is not enough, use one of the real time signals for your application.
If it must be able to handle the same signal from the timer and some other source, then depending on how fast, how many, what system, etc etc you could try setting a timestamp before registering a timer on when the timer will approximately exit, and then in the signal handler try to deduce if it was within time margin. I would strongly advise not to use this approach, but instead redesign what you are doing.
使用另一个 RT 信号。请参阅的答案有没有办法在 Linux 中创建用户定义的信号?
Use another RT signals. See answers on Is there any way to create a user defined signal in Linux?