我正在开发一个应该像服务器一样的程序,并不断从消息队列中读取并处理收到的消息。C - 优雅地中断msgrcv系统调用
主循环看起来是这样的:
while (1) {
/* Receive message */
if (msgrcv(msqid, &msg, sizeof(struct msgbuffer) - sizeof(long), 0, 0) == -1) {
perror("msgrcv");
exit(1);
}
//more code here
}
我遇到的问题是,我不能想出一个办法来正常退出这个循环不依靠客户端上发送邮件服务器表明它应该停止。我在循环之后做了大量的资源清理工作,并且我的代码永远无法达到那个点,因为循环不会结束。
有一件事我试图做的是侦听SIGINT结束循环....
volatile sig_atomic_t stop;
void end(int signum) {
stop = 1;
}
int main(int argc, char* argv[]) {
signal(SIGINT, end);
//some code
while (!stop) {
/* Receive message */
if (msgrcv(msqid, &msg, sizeof(struct msgbuffer) - sizeof(long), 0, 0) == -1) {
perror("msgrcv");
exit(1);
}
//more code here
}
//cleanup
}
...但由于环是挂在系统中调用自身,这不起作用,并且仅仅导致perror
打印出msgrcv: Interrupted system call
,而不是终止循环并清理我的资源。
有没有一种方法可以终止系统调用并正常退出我的循环?
SOLUTION:
感谢rivimey,我能解决我的问题。这是我做的工作:
volatile sig_atomic_t stop;
void end(int signum) {
stop = 1;
}
int main(int argc, char* argv[]) {
signal(SIGINT, end);
//some code
while (!stop) {
/* Receive message */
if (msgrcv(msqid, &msg, sizeof(struct msgbuffer) - sizeof(long), 0, 0) == -1) {
if (errno == EINTR) break;
else {
perror("msgrcv");
exit(1);
}
}
//more code here
}
//I can now reach this code segment
}
感谢您的信息。它帮助了很多。我会用我的问题的解决方案更新我的原始帖子。 – 2015-03-25 02:03:09