我需要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并在另一个进程上执行这些操作吗?或者,还有更好的方法? 谢谢你的帮助!
答案 0 :(得分:1)
是的,如果您的流程在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。它解释了为什么你必须总是使用尝试操作的方法,然后检查它是否成功。
另见: