通常,recv函数没有数据可用时会阻塞等待。同样地。当套接字输出队列没有祖公空间用来发送消息时,函数send会阻塞。在套接字非阻塞模式下,行为会改变。这种情况下,这些函数不会阻塞而失败,设置errno为EWOULDBLOCK或者EAGAIN。当这些发生时,可以使用poll或者select来判断何时能接受或者传输数据。
套接字机制有自己的方式来处理异步I/O.一些文献中吧经典的基于套接字的异步I/O机制称作“基于信号的I/O”以区别于实时扩展中的异步I/O机制。
在基于套接字的异步I/O中,当能够从套接字中读取数据,或者套接字写队列变得可用时,可以安排发送信号SIGIO。通过两个步骤欧来使用异步I/O;
1:建立套接字拥有者关系,信号可以被传送到合适的进程。
2:通知套接字当I/O操作不会阻塞时发信号告知。
可以使用三种方式来完成第一个操作步骤
1:在fcntl使用F_SETOWN命令(linux2.4.22支持)
2;在ioctl中使用FIOSETOWN命令(linux2.4.22不支持)
3:在ioctl中使用SIOCSPGRP命令(linux2.4.22支持)
要完成第二个操作,有两个选择:
1;在fcntl中使用F_SETFL命令并且启用文件标志O_ASYNC。 (linux2.4.22支持)
2;在ioctl中使用FIOASYNC。(linux2.4.22支持)
采用信号sigaction函数来注册接收到SIGIO所要做的处理。
网络IPC非阻塞和异步I/O
最新推荐文章于 2024-05-06 17:30:00 发布