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

Python 使用非阻塞打开检查何时发送所有数据,python,c,linux,io,blocking,Python,C,Linux,Io,Blocking,如果我以os.open('/dev/ttyS2',O|RDWR | O|NDELAY)的形式打开一个文件,有什么方法可以检查我的'write()'命令何时完成?或者,我可以打开一个文件进行非阻塞读取但阻塞写入吗?OS API write()返回写入字节的计数。根据输入的大小检查此值,您可以在发送所有输入时看到。将两个文件描述符打开到同一位置-一个用于非阻塞读取,另一个用于阻塞写入。您是否尝试过os.fsync(fd)?O\u NDELAY标志始终影响读取和写入。要在非阻塞文件上实现阻塞写入,可以

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

OS API write()返回写入字节的计数。根据输入的大小检查此值,您可以在发送所有输入时看到。

将两个文件描述符打开到同一位置-一个用于非阻塞读取,另一个用于阻塞写入。

您是否尝试过
os.fsync(fd)

O\u NDELAY标志始终影响读取和写入。要在非阻塞文件上实现阻塞写入,可以选择(Python模块)该文件,并在循环中变为可写时写入。

如果要写入tty(如示例中所示),可以使用
termios.tcdrain
等待所有写入的字节传输完毕


您的
write
系统调用仍然是非阻塞的,因此您需要处理
ewoodblock
/
EAGAIN
错误,并使用
select(2)
poll(2)
epoll(7)
来知道何时可以写入文件描述符。这些设计用于非阻塞文件描述符。

您对非阻塞的含义有误解。它并不意味着异步操作-您可以有异步/同步和阻塞/非阻塞的任意组合

write()
只需将数据交给内核处理即可。当
write()
成功返回时,内核现在已经处理了数据-无论文件描述符是阻塞的还是非阻塞的,这都是正确的。内核是否已经在这一点上完成了它的编写是一个独立的问题(通常,答案是“否”-大多数文件描述符都是异步的)

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


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

是否确定选择。选择()将使用非阻止文件描述符阻止?或者你指的是不同的选择模块method@Falmarri:是的,
select()。看来卡姆的tcdrain是个不错的选择。这不太正确。即使在非阻塞模式下,
写入
到普通文件,可能某些设备也会在缓冲区空间可用之前“阻塞”。非阻塞模式仅适用于套接字和特定于实现的其他文件描述符类型集合(可能包括终端设备/串行端口)。@R.
写入必须等待的普通文件不会阻塞-它是“磁盘等待”。