Linux——信号驱动IO

 

装了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 信号驱动IO。

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信号驱动IO。

 

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信号驱动IO

Linux支持BSD的信号驱动IO。

(0)UDP套接口上SIGIO信号。

SIGIO在UDP使用是最合适的,UDP套接口上的SIGIO只在以下2种事件种产生:

1。套接口上有数据到达。

2。UDP套接口已经连接的前提下,套接口发生异步错误。

(1)TCP套接口上SIGIO信号

SIGIO在TCP上几乎无用原于产生这种信号的事件,实在是太多了。Stevens 指出:我们应该考虑只对“监听(形容词)TCPsocket”(描述符)使用SIGIO,因为对于“监听TCPsocket”产生SIGIO的唯一条件是新连接完成。

 

 

你可能感兴趣的:(Linux)