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

时间:2010-10-04 18:56:45

标签: python c linux io blocking

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

6 个答案:

答案 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)