我正在将一个LynxOS程序迁移到ubuntu发行版和gcc 4.1.3
我几乎完成了,但是我有一个问题,我正在接收强制我的程序退出的SIGALRM信号。如果我不是在呼叫警报(X),我不知道为什么我会收到这个信号。
我用sigaction解决了这个问题,但是我的程序不能正常工作,每次收到这个SIGALRM时mq_receive都会失败。
我想知道是不是因为下面的代码翻译:
#include <events.h>
#include <timers.h>
evtset_t EvtMask;
struct timespec Time;
Time.tv_sec = 2;
Time.tv_nsec = 0;
evtsuspend (&EvtMask, &Time);现在会是
sleep(2);这是LynxOS给出的关于evtsuspend的信息:
evtsuspend (不能插入图片,因为我没有信誉)
你认为它们的工作原理是一样的吗?(不指定事件掩码) sleep()也会等待SIGALRM继续。
感谢并致以问候
发布于 2010-01-01 03:32:36
1)尝试在你的程序上运行strace,看看是否能找到更多信息。
能有更多关于你的计划的细节就太好了。但这也许会有所帮助。
也许mq_receive()超时了。我认为SIGALRM用于通知应用程序系统调用超时。
或者更有可能的是,您在代码中使用了其他导致SIGALRM的东西,即:setitimer()。
至于你提出的关于在linux上使用sleep(2)的问题。如果你想让程序在调用sleep(2)的过程中阻塞,那么你应该可以使用它。如果你不希望它阻塞,那么启动一个间隔计时器setitimer()并使用它。注意:当计时器触发时,setitimer()使用SIGALRM ...有关详细信息,请参阅manpage。
发布于 2013-03-28 13:08:46
我知道这是一个古老的话题,但这是对你问题中mq_receive()部分的回答:
当接收到信号时,mq_receive()将解除阻塞。当发生这种情况时,返回代码将被设置为-1,错误号将被设置为EINTR。您可以将代码包装在对mq_receive()的调用中,以检查这一点,并在必要时调用它。
https://stackoverflow.com/questions/1974172
复制相似问题