网络IPC:套接字之非阻塞和异步I/O
2024-08-24 19:32:01
通常,recv函数没有数据可用时会阻塞等待。同样地,当套接字输出队列没有足够空间来发送消息时函数send会阻塞。在套接字非阻塞模式下,行为会改变。在这种情况下,这些函数不会阻塞而是失败,设置errno为EWOULDBLOCK或者EAGAIN。当这些发生时,可以使用poll或select来判断何时能接收或者传输数据。
在Single UNIX Specification中,其实时扩展包含对通用异步I/O机制的支持。套接字机制有自己的方式来处理异步I/O,但是在Single UNIX Specification中没有标准化。一些文献把经典的基于套接字的异步I/O机制称为“基于信号的I/O”,以区别于实时扩展中的异步I/O机制。
在基于套接字的异步I/O中,当能够从套接字中读取数据,或者套接字写队列空间变得可用时,可以安排发送信号SIGIO。通过两个步骤来使用异步I/O:
(1)建立套接字拥有者关系,信号可以被传送到合适的进程。
(2)通知套接字当I/O操作不会阻塞时发信号告知。
可以使用三种方式来完成第一个步骤:
(1)在fcntl中使用F_SETOWN命令。
(2)在ioctl中使用FIOSETOWN命令。
(3)在ioctl中使用SIOCSPGRP命令。
要完成第二个步骤,有两个选择:
(1)在fcntl中使用F_SETFL命令并且启用文件标志O_ASYNC。
(2)在ioctl中使用FIOASYNC。
虽然有不少选择,但不是普遍得到支持。
本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。
最新文章
- 解决ArcGIS中因SDE或数据库配置问题而导致服务宕掉的一种思路
- web前端基础篇⑥
- KMP模式匹配
- Science:给青年科研工作者的忠告
- [置顶] 用Wireshark保存RTP的负载码流
- 使用PPRevealSideViewController实现侧滑效果
- php增删改查,自己写的demo
- Asp.net SignalR 初试和应用笔记一 认识和使用 SignalR
- lua学习笔记1
- ssh 如何通过外网访问内网多台服务器
- python--sum函数--sum(axis=1)
- JAVA基础-- 对象转型 (casting)
- Ubuntu 16.04.3 安装jenkins
- 【vim】把当前文件转化为网页
- RabbitMQ的应用场景以及基本原理介绍(转)
- asp.net webform 自定义 select 绑定数值
- 第二篇博客 wordcount
- VisualStudio、NETFramework及C#版本关系
- iOS pods更新失败
- Java事务管理之JDBC