我需要一些帮助.我需要能够接收到这样的信息:
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之类的东西。我怎么才能解决这个问题?我是否应该在一个进程中执行msgrcv,然后在另一个进程上执行呢?还是有更好的方法?谢谢你的帮助!
发布于 2016-12-10 03:35:18
是的,如果您的进程在msgrcv()期间接收到一个信号,它将被中断。
来自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。它解释了为什么您必须始终使用尝试操作的方法,然后检查它是否成功。
另请参阅:
https://stackoverflow.com/questions/41071650
复制相似问题