C - 使msgrcv与信号共存

时间:2016-12-10 02:43:23

标签: c ipc message-queue

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

while(1){
    int status = msgrcv(qid, &msg, sizeof(msg.data), user_id,0 )
    if(status < 0) { perror("something wrong..."); exit(1); }
}

还有代码的某处:

void stuff_to_do(int signal){
   //   ....
}
//...
signal(SIGQUIT, stuff_to_do);

但是我得到一个中断的系统调用,可能是因为信号杀死了msgrcv或类似的东西。 我怎么解决这个问题?我应该fork()并在一个进程中执行msgrcv并在另一个进程上执行这些操作吗?或者,还有更好的方法? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

是的,如果您的流程在msgrcv()期间收到信号,则会被中断。

来自man pages on msgrcv()

  

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

尝试识别此失败情况,然后使用类似

的内容重新启动msgrcv()
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。它解释了为什么你必须总是使用尝试操作的方法,然后检查它是否成功。

另见: