通常,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/

最新文章

  1. 解决ArcGIS中因SDE或数据库配置问题而导致服务宕掉的一种思路
  2. web前端基础篇⑥
  3. KMP模式匹配
  4. Science:给青年科研工作者的忠告
  5. [置顶] 用Wireshark保存RTP的负载码流
  6. 使用PPRevealSideViewController实现侧滑效果
  7. php增删改查,自己写的demo
  8. Asp.net SignalR 初试和应用笔记一 认识和使用 SignalR
  9. lua学习笔记1
  10. ssh 如何通过外网访问内网多台服务器
  11. python--sum函数--sum(axis=1)
  12. JAVA基础-- 对象转型 (casting)
  13. Ubuntu 16.04.3 安装jenkins
  14. 【vim】把当前文件转化为网页
  15. RabbitMQ的应用场景以及基本原理介绍(转)
  16. asp.net webform 自定义 select 绑定数值
  17. 第二篇博客 wordcount
  18. VisualStudio、NETFramework及C#版本关系
  19. iOS pods更新失败
  20. Java事务管理之JDBC

热门文章

  1. 关于ShareSDK接入的各种问题,以及解决方案
  2. Python之正则
  3. ado.net(class0503)
  4. jedis入门实例
  5. bzoj 3275 Number(最小割)
  6. Winxp下搭建SVN服务器
  7. 【更新sql server数据项的长度】////【复制数据到另一张表中】
  8. Downloading the Google Cloud Storage Client Library
  9. hive优化之------控制hive任务中的map数和reduce数
  10. 在linux上用dd命令实现ghost功能