python - 检查何时使用非阻塞打开发送所有数据

标签 python c linux io blocking

如果我以 os.open( '/dev/ttyS2', O_RDWR | O_NDELAY ) 打开文件,有什么方法可以检查我的 'write()' 命令何时完成?或者,我可以打开一个文件进行非阻塞读取但阻塞写入吗?

最佳答案

你对非阻塞的含义有误解。它暗示异步操作 - 您可以有异步/同步和阻塞/非阻塞的任意组合。

write() 只是将数据交给内核处理。当 write() 成功返回时,内核现在已经处理了数据 - 无论文件描述符是阻塞还是非阻塞都是如此。此时内核是否真的完成了写入是另一回事(通常,答案是否定的——大多数文件描述符是异步的)。

如果内核没有更多空间来缓冲您要写入的数据,则 write() 无法完成,这种情况受非阻塞与阻塞的影响 - 在阻塞中在这种情况下,write() 将阻塞直到空间可用。在非阻塞情况下,write() 将返回一个错误 (EAGAIN),您可以稍后重试。

如果您希望等到写入终端设备的所有数据都实际发送到硬件,请使用 tcdrain() - 但这可能是不必要的。或者,如果您希望 write() 阻塞直到您的数据被内核接受,那么您可以使用 fcntl() 临时将文件描述符设置为阻塞。

关于python - 检查何时使用非阻塞打开发送所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3858238/

相关文章:

c - c中的内存分配结构指针数组

linux - 将子域名指向本地ip

linux - 用文本框和图片组合图像

python - 如何使用 pandas 按组减去基于数据的列的行?

python - Cron 作业运行成功但没有任何反应

python - Django 总共只允许一个用户 session

linux - 在 Linux 上使用 VB.net 的 Windows TCP 套接字连接

python - 根据另一个 DataFrame 选择一个 DataFrame 的列

c++ - 使用 sprintf 和 sscanf 替换给定数字中的所有 0's with 5'

c - 当向链表添加一个节点时,它会覆盖之前的所有节点