您不需要POSIX AIO(即man aio)异步使用套接字和管道.根据man 3 aio它甚至不可能.您应该使用非阻塞文件描述符与替代,一起事件通知接口,如select(),poll()或epoll.epoll是特定于Linux的,但比前两个更好.
要在非阻塞模式下使用文件描述符,您必须O_NONBLOCK在每个文件描述符上设置标志:
fcntl(fd, F_SETFL, O_NONBLOCK)
Run Code Online (Sandbox Code Playgroud)
文件描述符处于非阻塞模式后,I/O操作类似于read()并且write()永远不会阻塞,但会返回EAGAIN或者EWOULDBLOCK如果操作无法立即完成.某些更具体的操作,例如connect(),必须以非阻塞模式以不同的方式使用; 请参阅相关手册页.
为了能够正确使用非阻塞文件descritors,您的应用程序需要是事件驱动的.基本上,main()你需要首先初始化东西,然后进入事件循环.事件循环重复等待事件(例如epoll_wait(),使用事件通知接口),然后检查发生了哪些事件,并响应它们.
现在当你说a read(),并且它失败时EWOULDBLOCK,你将它添加到文件描述符列表中,以便于阅读; 当事件提供者指示可读性时,您再试一次.
同样,如果您尝试write()并且失败EWOULDBLOCK,您可能希望缓冲数据并在指示可写性时再次尝试.
| 归档时间: |
|
| 查看次数: |
2750 次 |
| 最近记录: |