如果我打开一个文件os.open( '/dev/ttyS2', O_RDWR | O_NDELAY )
,有什么方法可以检查我的'write()'命令何时完成?或者,我可以打开文件进行非阻塞读取但阻止写入吗?
答案 0 :(得分:3)
如果您正在写tty(就像您的示例中那样),您可以使用termios.tcdrain
等待直到所有写入的字节都被传输。
您的write
系统调用仍然是无阻塞的,因此您需要处理EWOULDBLOCK
/ EAGAIN
错误,并使用select(2)
,poll(2)
或epoll(7)
知道何时可以写入文件描述符。这些设计用于非阻塞文件描述符。
答案 1 :(得分:3)
你对非阻塞意味着什么有误解。 不暗示异步操作 - 您可以拥有异步/同步和阻塞/非阻塞的任意组合。
write()
只是将数据传递给内核来处理。当write()
成功返回时,内核现在已经处理了数据 - 无论文件描述符是阻塞还是非阻塞,都是如此。内核是否实际上已经完成了此时的编写是一个单独的问题(通常,答案是“不” - 大多数文件描述符都是异步的。)
如果内核没有足够的空间缓冲您要写入的数据,则write()
无法完成,这是受非阻塞与阻塞影响的情况 - 在阻塞情况下,{{{} 1}}将阻塞,直到空间可用。在非阻止情况下,write()
将返回错误(write()
),您可以稍后重试。
如果您希望等到写入终端设备的所有数据实际上都已发送到硬件,请使用EAGAIN
- 但这可能是不必要的。或者,如果您希望阻塞tcdrain()
直到内核接受您的数据,那么您可以使用write()
临时将文件描述符设置为阻止。
答案 2 :(得分:1)
O_NDELAY标志始终影响读写。要在非阻塞文件上实现阻塞写入,您可以选择(Python模块)该文件,并在循环中变为可写时进行写入。
答案 3 :(得分:0)
OS API write()返回写入字节数。根据输入的大小检查此值,您可以看到发送所有输入的时间。
答案 4 :(得分:0)
将两个文件描述符打开到同一位置 - 一个用于非阻塞读取,另一个用于阻止写入。
答案 5 :(得分:0)
您是否尝试过os.fsync(fd)
?