Posix evtsuspend相当于

时间:2009-12-29 11:30:31

标签: c linux unix posix lynxos

我正在将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继续。

谢谢和问候

2 个答案:

答案 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()以查看此问题,并在必要时进行调用。