Linux——信号驱动IO
2011-01-25 20:11
399 查看
装了4天的操作系统 。。。呵呵收获颇多。
缅怀Stevens大师。
2.Linux man 命令:man 7 signal,man 7 socket。
3.UNP v1第25章 。
信号驱动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). */
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机制,就不再讨论了。呵呵。
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描述符。
(0)UDP套接口上SIGIO信号。
SIGIO在UDP使用是最合适的,UDP套接口上的SIGIO只在以下2种事件种产生:
1。套接口上有数据到达。
2。UDP套接口已经连接的前提下,套接口发生异步错误。
(1)TCP套接口上SIGIO信号。
SIGIO在TCP上几乎无用原于产生这种信号的事件,实在是太多了。Stevens 指出:我们应该考虑只对“监听(形容词)TCPsocket”(描述符)使用SIGIO,因为对于“监听TCPsocket”产生SIGIO的唯一条件是新连接完成。
缅怀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/OAPUE的描述: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/OAPUE的描述: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 IO模型漫谈(6)- 信号驱动IO模型
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux信号机制分析
- ARM开发之用linux通用GPIO接口宏函数操作IO口-----LED字符驱动为例
- linux内核驱动中_IO, _IOR, _IOW, _IOWR 宏的用法与解析
- 信号驱动IO的UDP回射服务器
- Linux 进程间通信 --- 信号通信 --- signal --- signal(SIGINT, my_func); --- 按键驱动异步通知
- linux设备驱动归纳总结(三):5.阻塞型IO实现
- Linux驱动(六)设备驱动中的阻塞与非阻塞IO
- Linux设备驱动第六篇:高级字符驱动操作之iotcl
- linux设备驱动归纳总结(三):5.阻塞型IO实现
- linux设备驱动归纳总结(三):.阻塞型IO实现
- linux驱动学习记录(三)-PCI IO读写、中断、DMA传输
- linux驱动的异步通知(kill_fasync,fasync)---- 驱动程序向应用程序发送信号
- [arm驱动]linux等待队列阻塞中断IO的应用 推荐
- Linux_设备驱动阻塞/非阻塞IO_等待队列
- linux 内核驱动编程 简单例子 与_IO, _IOR, _IOW, _IOWR 宏解析
- Linux设备驱动第六篇:高级字符驱动操作之iotcl
- 信号驱动io
- Linux IO模型漫谈(6)- 信号驱动IO模型 - 轩脉刃 - 博客园
- linux下五种IO模型小结(阻塞IO、非阻塞IO、IO复用、信号驱动式IO、异步IO)