首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Posix事件挂起等效项

Posix事件挂起等效项
EN

Stack Overflow用户
提问于 2009-12-29 19:30:31
回答 2查看 140关注 0票数 0

我正在将一个LynxOS程序迁移到ubuntu发行版和gcc 4.1.3

我几乎完成了,但是我有一个问题,我正在接收强制我的程序退出的SIGALRM信号。如果我不是在呼叫警报(X),我不知道为什么我会收到这个信号。

我用sigaction解决了这个问题,但是我的程序不能正常工作,每次收到这个SIGALRM时mq_receive都会失败。

我想知道是不是因为下面的代码翻译:

代码语言:javascript
复制
#include <events.h>
#include <timers.h>

evtset_t EvtMask;
struct timespec Time;

Time.tv_sec = 2;
Time.tv_nsec = 0;
evtsuspend (&EvtMask, &Time);

现在会是

代码语言:javascript
复制
sleep(2);

这是LynxOS给出的关于evtsuspend的信息:

evtsuspend (不能插入图片,因为我没有信誉)

你认为它们的工作原理是一样的吗?(不指定事件掩码) sleep()也会等待SIGALRM继续。

感谢并致以问候

EN

回答 2

Stack Overflow用户

发布于 2010-01-01 03:32:36

1)尝试在你的程序上运行strace,看看是否能找到更多信息。

能有更多关于你的计划的细节就太好了。但这也许会有所帮助。

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2013-03-28 13:08:46

我知道这是一个古老的话题,但这是对你问题中mq_receive()部分的回答:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1974172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档