【发布时间】:2015-05-12 00:00:17
【问题描述】:
在 Linux 文档中,POLLOUT 表示可以写入普通数据而不会阻塞。嗯,但是这个解释是模棱两可的。
在poll 报告此事件后,可以写入多少数据而不阻塞? 1个字节? 2个字节?技嘉?
在POLLOUT 阻塞套接字事件之后,如何检查我可以在没有阻塞的情况下向套接字发送多少数据?
【问题讨论】:
-
When to use POLLOUT?的可能重复
在 Linux 文档中,POLLOUT 表示可以写入普通数据而不会阻塞。嗯,但是这个解释是模棱两可的。
在poll 报告此事件后,可以写入多少数据而不阻塞? 1个字节? 2个字节?技嘉?
在POLLOUT 阻塞套接字事件之后,如何检查我可以在没有阻塞的情况下向套接字发送多少数据?
【问题讨论】:
poll 系统调用只告诉您文件描述符(物理设备)中发生了一些事情,但它不会告诉您有多少空间可供您读取或写入。为了准确知道有多少字节数据可用于读取或写入,您必须使用 read() 或 write() 系统调用来获取返回值,该值表示您实际读取或写入的字节数。
因此,poll() 主要用于必须使用多个输入或输出流而不会卡在其中任何一个上的应用程序。在这种情况下,您不能使用 write() 或 read(),因为您无法在一个线程中同时监控多个描述符。
顺便说一句,对于设备驱动,驱动中 POLL 的底层实现通常是这样的(代码来自 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 时,您必须始终为部分读取和写入做好准备。
【讨论】: