分类: 系统运维
2012-04-03 09:59:46
通常recv函数会阻塞,当没有数据立即可用时。相似地,send函数会阻塞,当套接字的输出队列里没有足够空间来发送数据时。当套接字在非阻塞模 式时行为为改变。在这种情况下,这些函数会失败而不是阻塞,设置errno为EWOURLDBLOCK或EAGAIN。当这发生时,我们可以使用poll 或select来确定我们可时可以接收或传送数据。
SUS的实时扩展包含对通用异步I/O机制的支持。套接字机制有它自己处理异步I/O的方法,但是这没有在SUS里标准化。一些文本引用经典的基于套接字的异步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命令。
我们有几个选项,但是它们不被统一支持。下表总结了为由本文讨论的平台提供的对这些选项的支持。我们在提供支持的地方显示*,在支持取决于特定域的地方显示+。例如,在Linux上,UNIX域套拼字不支持FIOSETOWN或SIOCSPGRP。
机制 | POSIX.1 | FreeBSD | Linux | Mac | Solaris |
---|---|---|---|---|---|
fcntl(fd, F_SETOWN, pid) | * | * | * | * | * |
ioctl(fd, FIIOSETOWN, pid) | * | + | * | * | |
ioctl(fd, SIOCSPGRP, pid) | * | + | * | * | |
fcntl(fd, F_SETFL, flags|O_ASYNC) | * | * | * | ||
ioctl(fd, FIOASYNC, &n) | * | * | * | * |