我正在将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继续。
谢谢和问候
答案 0 :(得分:3)
1)尝试在程序上运行strace以查看是否可以找到更多信息。
获得有关您的计划的更多详细信息会很高兴......但也许这会有所帮助。
也许mq_receive()
超时。我认为 SIGALRM用于通知应用程序超时系统调用。
或者更有可能的是,您在代码中使用了导致SIGALRM的其他内容,即:setitimer()
。
关于在linux上使用sleep(2)的问题。如果你想让程序在sleep(2)调用期间阻塞,那么你应该可以使用它。如果您不希望它阻止,则启动间隔计时器setitimer()
并使用它。注意:setitimer()在计时器触发时使用SIGALRM ...有关详细信息,请参阅manpage。
答案 1 :(得分:0)
我认为这是一个古老的主题,但这里是您问题的mq_receive()
部分的答案:
mq_receive()
将取消阻止。发生这种情况时,返回码将设置为-1
,而errno将设置为EINTR
。您可以将代码打包到mq_receive()
以查看此问题,并在必要时进行调用。