文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>msgsnd && msgrcv被信号中断

msgsnd && msgrcv被信号中断

时间:2010-11-20  来源:luvi88

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


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载