【问题标题】:Posix evtsuspend equivalentPosix evtsuspend 等效项
【发布时间】:2009-12-29 11:30:31
【问题描述】:

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

感谢和问候

【问题讨论】:

    标签: c linux unix posix lynxos


    【解决方案1】:

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

    如果能提供有关您的程序的更多详细信息会很高兴...但也许这会有所帮助。

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-08-23
        • 2011-11-12
        • 2016-04-16
        • 2016-01-10
        • 1970-01-01
        • 2015-03-19
        • 2021-05-04
        • 2016-12-12
        • 1970-01-01
        相关资源
        最近更新 更多