0

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

谢谢并恭祝安康

4

2 回答 2

3

1) 尝试在您的程序上运行 strace 以查看是否可以找到更多信息。

有更多关于您的程序的详细信息会很好......但这可能会有所帮助。

也许mq_receive()是超时。我认为SIGALRM 用于通知应用程序超时系统调用。

或者更有可能的是,您在代码中使用了其他导致 SIGALRM 的东西,即:setitimer().

至于您关于在 linux 上使用 sleep(2) 的问题。如果您希望程序在 sleep(2) 调用期间阻塞,那么是的,您应该可以使用它。如果您不希望它阻塞,请启动一个间隔计时器setitimer()并使用它。注意:当计时器触发时,setitimer() 使用 SIGALRM...有关详细信息,请参阅手册页

于 2009-12-31T19:32:35.530 回答
0

我看到这是一个老话题,但这是mq_receive()您问题部分的答案:

mq_receive()收到信号时会解除阻塞。发生这种情况时,返回码将设置为-1,errno 将设置为EINTR。您可以将代码包装在您的调用周围mq_receive()以检查这一点并在必要时调用它。

于 2013-03-28T05:08:45.627 回答