``pollout''Linux函数中的“ Pollout”事件是什么意思

What does `POLLOUT` event in `poll` Linux function mean?

本文关键字:意思 是什么 Pollout 事件 pollout Linux 函数      更新时间:2023-10-16

从Linux文档中,POLLOUT含义正常数据可以编写而不阻止。好吧,但是这种解释是歧义的。poll报告此事件后,可以写入多少数据而不阻止?1个字节?2个字节?千兆字?POLLOUT在阻塞套接字上发生后,如何检查我可以在没有块的情况下发送到套接字的数据?

轮询系统调用只会告诉您文件描述符(物理设备)中发生了一些事情,但它没有告诉您有多少空间可以读取或写入。为了确切知道可用于读取或写入的字节数据,您必须使用read()或write()系统调用来获取返回值,以说明您实际读取或编写的字节数。

因此,poll()主要用于必须使用多个输入或输出流的应用,而不会陷入其中任何一个。在这种情况下,您不能使用write()或read(),因为您不能在一个线程中同时监视多个描述符。

btw,对于设备驱动程序,驱动程序中的民意调查的基础实现通常喜欢此(ldd3的代码):

  static unsigned int scull_p_poll(struct file *filp, poll_table *wait)
    {
      poll_wait(filp, &dev->inq, wait);
      poll_wait(filp, &dev->outq, wait);
      ...........
      if (spacefree(dev))
          mask |= POLLOUT | POLLWRNORM; /* writable */
      up(&dev->sem);
      return mask; 
    }

如果poll()设置POLLOUT标志,则至少可以编写一个字节而不会阻止。然后,您可能会发现write()操作仅执行部分写入,因此通过返回短计数来指示。当通过poll()和/或select()多路复用I/O时,您必须始终准备部分读取和写入。