linux系统消息队列使用时,会与信号冲突。msgsnd/msgrcv以block方式发送/接收消息时,会因为进程收到了信号而中断。此时msgsnd/msgrcv将返回-1,errno被设置为EINTR(-4)。且即使在插入信号时设置了SA_RESTART,也无效。
此时我们只好用如下方式来重启消息队列:
while(TRUE) { err = msgrcv(msgid, buf, sizeof(buf), 0); if (-1 == err){ if (EINTR == errno){ continue; } perror("msgrcv"); break; }
/* deal message */ deal_msg(...); }
|
附:插入信号时,设置SA_RESTART方式:
void handler(int signo) { printf("i got the signal %d\n",signo); }
int main() { struct sigaction action; sigset_t set; printf("waiting for signal\n"); action.sa_handler=handler; sigemptyset(&action.sa_mask); action.sa_flags|=SA_RESTART; sigaction(SIGALRM,&action,NULL);
/* do sth with block way */ do_block_thing(); }
|
阅读(2811) | 评论(2) | 转发(0) |