我正在開發一個應該像服務器一樣的程序,並不斷從消息隊列中讀取並處理收到的消息。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