所谓的 signal-driven I/O是指:当一个进程执行IO操作(读或写)时,内核马上返回,进程继续运行。当刚才指定的IO操作完成后(或出错),通过信号通知进程。
Signal-Driven I/O for Sockets
三个步骤:
- 为SIGIO建立signal handler
- 必须设定socket owner,一般使用fcntl设置F_SETOWN
- 设置socket允许Signal-driven I/O,通过fcntl设置F_SETFL,用来开启O_ASYNC flag(也可用FIOASYNC ioctl进行设置)
要在设定socket owner之前设置signal handler。
SIGIO with UDP Sockets
在下面情况产生:
- datagram到达
- asynchronous error产生
当捕获消息后,可调用recvfrom读取数据或error
SIGIO with TCP Sockets
signal-driven I/O对TCP没什么用,因为产生的太过频繁,而且不能告诉我们发生了什么。在下面情况产生:
- 对listening socket,一个连接请求完成
- 一个disconnect请求完成初始化
- 一个disconnect请求完成
- Half of a connection被shut down
- 数据到达
- 数据被发送
- asynchronous error产生
We should consider using SIGIO only with a listening TCP socket, because the only condition that generates SIGIO for a listening socket is the completion of a new connection.