首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C- make msgrcv与信号共存

C- make msgrcv与信号共存
EN

Stack Overflow用户
提问于 2016-12-10 02:43:23
回答 1查看 755关注 0票数 0

我需要一些帮助.我需要能够接收到这样的信息:

代码语言:javascript
复制
while(1){
    int status = msgrcv(qid, &msg, sizeof(msg.data), user_id,0 )
    if(status < 0) { perror("something wrong..."); exit(1); }
}

也在代码的某个地方:

代码语言:javascript
复制
void stuff_to_do(int signal){
   //   ....
}
//...
signal(SIGQUIT, stuff_to_do);

但是我接到一个中断的系统呼叫,可能是因为信号杀死了msgrcv之类的东西。我怎么才能解决这个问题?我是否应该在一个进程中执行msgrcv,然后在另一个进程上执行呢?还是有更好的方法?谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-10 03:35:18

是的,如果您的进程在msgrcv()期间接收到一个信号,它将被中断。

来自msgrcv()

调用进程捕获一个信号。在这种情况下,如果errno设置为EINTR,系统调用就会失败。(msgrcv()在被信号处理程序中断后永远不会自动重新启动,无论在建立信号处理程序时SA_RESTART标志的设置如何。)

尝试识别此故障情况,只需使用以下内容重新启动msgrcv()

代码语言:javascript
复制
while (1) {
    // Try to receive message
    errno = 0;
    int status = msgrcv(qid, &msg, sizeof(msg.data), user_id,0 )

    if (status < 0) {
        if (errno == EINTR) continue;  // try again

        // Something else went wrong
        perror("something wrong...");
        exit(1);
    }
}

不要忘记,您必须在要测试的操作之前手动设置errno = 0

这让我想起了一个描述并发性和并发性的good answer。它解释了为什么您必须始终使用尝试操作的方法,然后检查它是否成功。

另请参阅:

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

https://stackoverflow.com/questions/41071650

复制
相关文章

相似问题

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