msgrcv出错errno=4[Interrupted system call]系统调用被信号中断

在嵌入式Linux中,当使用msgrcv时遇到错误errno=4,即系统调用被信号中断。文章介绍了EINTR错误的产生原因和解决方法,包括人为重启系统调用、设置SA_RESTART属性(对某些调用无效)以及忽略信号。通过新开线程处理msgrcv等消息队列操作,作者成功解决了问题。
摘要由CSDN通过智能技术生成

原创:http://blog.csdn.net/guo8113/article/details/44355329

    今天在嵌入式Linux中调试msgrcv时出现其返回为-1,错误代码4的错误:errno=4[Interruptedsystem call]。错误代码4为: 当进程睡眠等待接收消息时,被信号中断。    这是由于在此线程中同时使用了信号,而慢系统调用(阻塞系统调用)在使线程休眠等待时被信号唤醒,当捕获到某个信号且相应信号处理函数返回时,这个系统调用被中断,调用返回错误,设置errno为EINTR(相应的错误描述为“Interruptedsystem call”)。

         网上有人说在安装信号时设置SA_RESTART属性(该方法对有的系统调用无效,在http://blog.chinaunix.net/uid-21501855-id-4490453.html得到了验证),并忽略EINTR错误,我试了无效,最终新开了一个线程,在新的线程里处理msgrcv等msgq的操作,顺利解决了问题。

1.术语

慢系统调用适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用是指调用永远无法返回,多数网络支持函数都属于这一类。如:若没有客户连接到服务器上,那么服务器的accept调用就会一直阻塞。

慢系统调用可以被永久阻塞,包括以下几个类别:

1)读写设备(包括pipe,终端设备,网络连接等)。读时,数据不存在,需要等待;写时,缓冲区满或其他原因,需要等待。读写磁盘文件一般不会阻塞。

2)当打开某些特殊文件时,需要等待某些条件,才能打开。例如:打开中断设备时,需要等到连接设备的modem响应才能完成。

3pausewait函数。pause函数使调用进程睡眠,直到捕获到一个信号。wait等待子进程终止。

4)某些ioctl操作。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值