Socket信号驱动
来源:互联网 发布:美国非农数据公布网址 编辑:程序博客网 时间:2024/04/29 03:10
信号驱动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中定义的相关信号:
#defineSIGPOLLSIGIO/* Pollable event occurred (System V). */
#defineSIGIO29/* 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信号驱动IOLinux支持BSD的信号驱动IO。
(0)UDP套接口上SIGIO信号。
SIGIO在UDP使用是最合适的,UDP套接口上的SIGIO只在以下2种事件种产生:
1。套接口上有数据到达。
2。UDP套接口已经连接的前提下,套接口发生异步错误。
(1)TCP套接口上SIGIO信号。
SIGIO在TCP上几乎无用原于产生这种信号的事件,实在是太多了。Stevens 指出:我们应该考虑只对“监听(形容词)TCPsocket”(描述符)使用SIGIO,因为对于“监听TCPsocket”产生SIGIO的唯一条件是新连接完成。
转载自:http://hi.baidu.com/xiaoyue1800/item/d519f281ebdadbe1e496e0d9
- Socket信号驱动
- Socket层实现系列 — 信号驱动的异步等待
- 信号驱动io
- 信号驱动io
- socket中的SIGPIPE信号问题
- socket编程中的SIGPIPE信号
- 信号驱动式io小结
- 信号驱动I/O实例
- socket编程问题-SIGPIPE信号处理
- linux socket通信之SIGPIPE信号
- send或者write socket遭遇SIGPIPE信号
- send或者write socket遭遇SIGPIPE信号
- socket编程问题-SIGPIPE信号处理
- socket编程问题-SIGPIPE信号处理
- send或者write socket遭遇SIGPIPE信号
- socket编程中出现SIGPIPE信号
- send或者write socket遭遇SIGPIPE信号
- send或者write socket遭遇SIGPIPE信号
- mysql hash 索引 vs B-TREE 索引 理解
- Unable to start activity : java .lang.nullPointException
- 享受蓝牙(番外篇): 蓝牙不完全装逼手册(陆续更新)
- 嵌入式系统--构成
- 学习写写sql/pl
- Socket信号驱动
- c语言中内存对齐与位域对齐
- IOS 之 多线程
- ORACLE PL/SQL 高级部分-事例
- poj 3278 Catch That Cow If I know what love is, it is because of you
- 异步IO
- 悉心沉淀,耐心坚持!
- FIFO、LRU、OPT这三种置换算法的缺页次数
- Ubuntu 13.10编译安装linux-3.12-rc6(内核编译安装)