装了4天的操作系统 。。。呵呵收获颇多。
缅怀Stevens大师。
1.师从互联网。
2.Linux man 命令:man 7 signal,man 7 socket。
3.UNP v1第25章 。
信号驱动IO,不是异步IO。
信号驱动IO是指:进程预先告知内核,使得 当某个socketfd有events(事件)发生时,内核使用信号通知相关进程。
异步IO(Asynchronous IO)是指:进程执行IO系统调用(read / write)告知内核启动某个IO操作,内核启动IO操作后立即返回到进程。IO操作即内核当中的服务例程。Posix 通过 aio_XXX函数提供真正的异步IO(参见 man 7 aio).
linux 2.6.35中定义的相关信号:
#define SIGPOLL SIGIO /* Pollable event occurred (System V). */
#define SIGIO 29 /* I/O now possible (4.2 BSD). */
System V Asynchronous I/O
APUE的描述:In System V, asynchronous I/O is part of the STREAMS system and works only with STREAMS devices and STREAMS pipes. The System V asynchronous I/O signal is SIGPOLL.To enable asynchronous I/O for a STREAMS device, we have to call ioctl with a second argument (request) of I_SETSIG.
在System V当中,异步IO是STREAMS机制的一部分,并且她只能工作在流设备和流管道上。System V 异步IO信号是SIGPOLL。我们可以用I_SETSIG为第二个参数调用ioctl,来在一个设备上开启异步IO功能。由于linux抛弃了 STREAMS机制,就不再讨论了。呵呵。
BSD Asynchronous I/O
APUE的描述:Asynchronous I/O in BSD-derived systems is a combination of two signals: SIGIO and SIGURG. The former is the general asynchronous I/O signal, and the latter is used only to notify the process that out-of-band data has arrived on a network connection.
基于BSD系统的异步IO机制是通过SIGIO和SIGURG信号组合实现的。SIGIO用于一般的异步IO,SIGURG(urgent)仅用于提醒(notify)进程网络连接上有带外数据到达,什么是带外数据,就是一个字节的紧急数据,用于告诉对端,我们的机器上有某种紧急事件发生了,比方说要宕机。
(0)在描述符上开启SIGIO信号驱动IO功能,只需3步,仅需3步哟,就可以不用轮询机制来耗费CPU接收数据:
1调用signal或sigaction,为信号SIGIO建立信号处理函数。
2设置套接口的属主。通过调用fcntl得F_SETOWN命令,在套接口设置接收SIGIO信号的进程或进程组。
3开启套接口上的信号驱动IO,通过fcntl的F_SETFL命令,在套接口上设置O_ASYNC。
(0.1)注:
1。ioctl的FIOASYNX功能也可实现第3步这个功能。
2。fctl和ioctl所引用的 描述符只能是终端和网络socket。
例子:
signal(SIGIO, &input_handler);
fcntl(STDIN_FILENO, F_SETOWN, getpid());
oflags = fcntl(STDIN_FILENO, F_GETFL);
fcntl(STDIN_FILENO, F_SETFL, oflags | FASYNC);
(1)在描述符上开启SIGURG信号驱动IO功能,只需2步。
1调用signal或sigaction,为信号SIGURG建立信号处理函数。
2设置套接口的属主。通过调用fcntl得F_SETOWN命令,在套接口设置接收SIGURG信号的进程或进程组。
(1.1)注:所引用的描述符只能是:支持带外数据的网络连接的socket描述符。
Linux支持BSD的信号驱动IO。
(0)UDP套接口上SIGIO信号。
SIGIO在UDP使用是最合适的,UDP套接口上的SIGIO只在以下2种事件种产生:
1。套接口上有数据到达。
2。UDP套接口已经连接的前提下,套接口发生异步错误。
(1)TCP套接口上SIGIO信号。
SIGIO在TCP上几乎无用原于产生这种信号的事件,实在是太多了。Stevens 指出:我们应该考虑只对“监听(形容词)TCPsocket”(描述符)使用SIGIO,因为对于“监听TCPsocket”产生SIGIO的唯一条件是新连接完成。