信号驱动式IO对于TCP套接字产生的作用不大。因为该信号在TCP套接字中产生的过于频繁。
以下条件均会导致对一个TCP套接字产生SIGIO信号:
- 监听套接字上某个连接请求已经完成;
- 某个断连请求已经发起;
- 某个断连请求已经完成;
- 某个连接之半已经关闭;
- 数据到达套接字;
- 数据已经从套接字发送走;
- 发生某个异步错误。
这么多条件都会触发SIGIO信号,导致应用进程对该信号一头雾水,没法确定套接字具体发生了什么事情。不过可以对TCP监听套接字可以使用SIGIO,因为对于监听套接字,产生SIGIO信号的唯一条件是某个新连接完成了。这样就可以在SIGIO信号处理函数中获取新连接了。
UDP套接字中,只有以下两个条件会产生SIGIO信号:
- 数据报到达套接字;
- 套接字上发生异步错误。
所以,针对UDP套接字产生的SIGIO信号,我们只要调用recvfrom读入到达的数据,或者获取发生的异步错误就可以了。