Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17181
  • 博文数量: 6
  • 博客积分: 207
  • 博客等级: 入伍新兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-20 23:04
个人简介

宠辱不惊,闲看庭前花开花落; 去留无意,漫随天边云卷云舒。

文章分类

全部博文(6)

文章存档

2013年(3)

2010年(3)

我的朋友
最近访客

分类: C/C++

2010-11-20 22:11:26

    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();
}


阅读(2670) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-11-22 20:58:40

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com

luvi882010-11-20 22:14:59

这种方式明显有缺点,大家有什么好的方法,拿出来共享一下。