1.阻塞与非阻塞
非阻塞:程序调用后,不管能不能立刻得到结果,当前进程都会直接返回。如果得到结果则返回成功,否则返回失败。
阻塞:程序调用后,如果不能立刻得到结果,则当前进程会被挂起,无限期等待,直到得到结果时才会返回。
系统调用一般可通过参数控制阻塞或者非阻塞。
常用在IPC通信和网络通信中,需要根据同步或异步设置阻塞和非阻塞:
msgsnd/msgrcv:消息队列发送、接收消息。
semop:信号量操作,用户改变信号量的值。P、V操作。
send/recv,read/write:socket 发送、读写缓冲区。
2.errno ENTIR
errno ENTIR(4) 系统调用被信号中断,一般发生在被阻塞的系统调用中。
3.解决办法
在阻塞调用失败后,检查系统错误码 errno 是否是 ENTIR, 重复当前系统调用。
msgsnd代码示例(msgsnd最后一个参数为0代表当消息队列满时,msgsnd将会阻塞,直到消息能写进消息队列):
... while (1) { if (msgsnd( msqid, &sendbuf, sendlen, 0) < 0 && errno == ENTIR) { continue; } break; } ...
讯享网
参考true0face-系统调用中断。链接:https://blog.csdn.net/true0face/article/details/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/73105.html