异步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_INPUT 
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/


0 0
原创粉丝点击