异步I/O
来源:互联网 发布:淘宝直播ipad可以看吗 编辑:程序博客网 时间:2024/05/15 04:59
一。系统V和BSD派生的所有系统提供了使用一个信号的异步io方法。异步io的一个限制是每个进程只有一个信号,如果要对几个描述符进行异步io,那么进程收到该信号并不知道这信号对应于哪个描述符。
系统V的异步io只对STREAMS设备和STREAMS管道其作用,通知信号用的是SIGPOLL。
BSD的派生系统异步io只对终端和网络起作用,信号是SIGIO。
二、异步io实现
1、系统V异步I/O在系统V中,异步I/O是STREAMS系统的一部分。它只对STREAMS设备和STREAMS管道起作用。系统V的异步I/O信号是SIGPOLL。
为了对一个STREAMS设备启动异步I/O,需要调用ioctl,它的第二个参数(request)是I_SETSIG。第三个参数是由表14-7中的常量构成的整型值。这些常量在<stropts.h>中定义。
S_RDNORM
S_RDBAND
S_BANDURG
S_HIPRI非高优先级消息已到达
普通消息已到达
非0优先级波段消息已到达
若此常量和S_RDBAND一起指定,则当一非0优先级波段消息已到达时,产生SIGURG信号而非SIGPOLL
高优先级消息已到达S_OUTPUT
S_WRNORM
S_WRBAND写队列不再满
与S_OUTPUT相同
可发送非0优先级波段消息S_MSG
S_ERROR
S_HANGUP包含SIGPOLL信号的STREAMS信号消息已到达
M_ERROR消息已到达
M_HANGUP消息已到达
“已到达” 的意思是“已到达流首的读队列”。
除了调用ioctl说明产生SIGPOLL信号的条件以外,还应为该信号建立信号处理程序。回忆表10-1(http://www.cnblogs.com/nufangrensheng/p/3514157.html),对于SIGPOLL的默认动作是终止该进程,所以应当在调用ioctl之前建立信号处理程序。
2.、BSD异步I/O
在BSB派生的系统中,异步I/O是SIGIO和SIGURG两个信号的组合。前者是通用异步I/O信号,后者则用来通知进程在网络连接上到达了带外的数据(http://blog.chinaunix.net/uid-27164517-id-3275870.html)。为了接收SIGIO信号,需执行下列三步:
(1)调用signal或sigaction为SIGIO信号建立信号处理程序。
(2)以命令F_SETOWN(见http://www.cnblogs.com/nufangrensheng/p/3500350.html)调用fcntl来设置进程ID和进程组ID,它们将接收对于该描述符的信号。
(3)以命令F_SETFL调用fcntl设置O_ASYNC文件状态标志,使在该描述符上可以进行异步I/O(见http://www.cnblogs.com/nufangrensheng/p/3500350.html中的表3-3)。
第(3)步仅能对指向终端或网络的描述符执行,这是BSD异步I/O设施的一个基本限制。
对于SIGURG信号,只需执行第(1)步和第(2)步。该信号仅对引用支持带外数据的网络连接描述符而产生。
3.POSIX异步I/O
http://www.ibm.com/developerworks/cn/linux/l-async/
- 异步文件 I/O
- 异步I/O
- 异步I/O机制
- I/O 异步访问
- 异步I/O
- I/O异步demo
- 异步I/O
- 异步设备I/O
- 异步I/O
- python 异步I/O
- Linux异步I/O
- Nodejs 异步 I/O
- nodejs-异步I/O
- 异步I/O
- 异步I/O原理
- 伪异步I/O
- NodeJS -- 异步I/O
- 伪异步I/O
- HDU 1873看病要排队
- 解决Android软键盘挡住登录按钮的问题!
- 一个更为详细的MyBatis(3.2.3)示例
- C#调用C(C++)dll,针对结构体的微软小工具
- 台风体验
- 异步I/O
- Eclipse下查看jdk源代码
- 小心StringBuilder.toString
- 假广告
- ArcGIS教程:栅格计算器的工作原理
- 融入了最新的Java应用技术的洞察
- OTSU算法及其改进算法学习
- SQLite清空表并将自增列归零
- 触摸G4全球定位系统的Wi-Fi的中国手机