信号驱动式I/O

基础
  • 概念
    信号驱动式I/O是指进程预先告知内核,使得当某个描述符上发生某事是,内核使用信号通知相关进程

  • 步骤
    针对一个套接字使用信号驱动式I/O,要求进程执行以下3个步骤:

    • 建立SIGIO信号处理函数
      signal(SIGIO, sig_io);
      
    • 设置该套接字的属主进程,通常使用fcntl的F_SETOWN命令设置
      fcntl(sockfd, F_SETOWN, getpid());
      
    • 开启该套接字的信号驱动式I/O,通常通过使用fcntl的F_SETFL命令打开O_ASYNC标志
      const int on = 1;
      ioctl(sockfd,  O_ASYNC,  &on);
      
对于TCP

总的来说,信号驱动式I/O对于TCP套接字近乎无用,因为该信号产生得过于频繁,不能区分具体是哪种事件

  • 监听套接字上某个连接请求请求已经完成
  • 某个断连接请求已经发起
  • 某个连接之半已经关闭
  • 数据到达套接字
  • 数据已经从套接字发送走(即输出缓冲区有空闲空间)
  • 发生某个异步错误

从上面看出,我们只能对监听套接字使用SIGIO,因为对于监听套接字产生SIGIO的唯一条件一定是某个新连接的完成。

对于UDP

在UDP上使用信号驱动式I/O比较简单的。SIGIO信号在发生以下事件时产生

  • 数据报到达套接字
  • 套接字上产生异步错误
    因此当捕获对于某个UDP套接字上的SIGIO信号时,我们调用recvfrom等读入到达的数据报,或者获取发生的异步错误。
信号驱动式I/O_第1张图片
构建UDP服务器的2种方式.jpg

参考资料
《UNIX 网络编程》3th [美] W.Richard Stevens,Bill Fenner,Andrew M. Rudoff

你可能感兴趣的:(信号驱动式I/O)