信号驱动式I/O是一种 “拉模式”,当数据报到达时触发SIGIO信号,该信号通知数据已经到来,并没有将数据都入到应用程序的buffer中。
因此,还需要我们在SIGIO信号处理函数中,手动的读取到来的数据,将其存放在buffer中。
针对一个套接字使用信号驱动式IO(SIGIO)要求进程执行以下3个步骤
:
(1) 建立SIGIO信号捕捉函数
(2) 设置套接字的属主,通常使用fcntl的F_SETOWN命令设置
(3) 开启该套接字的信号驱动式IO,通常使用fcntl的F_SETFL命令打开O_ASYNC标志
对于UDP套接字,SIGIO信号在发生以下事件时产生:
① 数据包到达套接字(需要在SIGIO信号捕捉函数中调用recvform去读取)
② 套接字上发生异步错误
对于TCP套接字,信号驱动式IO对其近乎无用,我们应该考虑只对监听TCP套接字使用SIGIO
(因为对于监听套接字产生SIGIO的唯一条件是某个新连接的完成)
大多数UDP服务器(基于UDP的NTP服务器程序)的工作方式
当新的数据报达到时,SIGIO信号到达,服务器程序的SIGIO信号捕捉函数读入该数据报,同时记录它的到达时刻,然后将它添加到进程内的一个数据队列中,以便服务器循环移走并处理数据。