代码之家  ›  专栏  ›  技术社区  ›  Falmarri

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

  •  0
  • Falmarri  · 技术社区  · 14 年前

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

    6 回复  |  直到 14 年前
        1
  •  3
  •   caf    14 年前

    暗示异步操作-可以有异步/同步和阻塞/非阻塞的任意组合。

    一个 write() 返回成功,内核现在已经处理数据-这是真的,不管文件描述符是阻塞的还是非阻塞的。此时内核是否真正完成了它的编写是一个单独的问题(通常,答案是“否”-大多数文件描述符是异步的)。

    一个 如果内核没有足够的空间来缓冲您要写入的数据,并且这是受非阻塞与阻塞影响的情况,则无法完成 将阻塞,直到空间可用。在非阻塞情况下, 写入() EAGAIN ),然后由您稍后重试。

    tcdrain() -但这可能是不必要的。或者,如果你愿意 写入() 在数据被内核接受之前阻塞,然后可以使用 fcntl()

        2
  •  3
  •   camh    14 年前

    如果您正在给tty写信(如您在示例中所示),可以使用 termios.tcdrain 等待所有写入的字节都被传输。

    你的 write 系统调用仍然是非阻塞的,因此您需要处理 EWOULDBLOCK EAGAIN 错误和使用 select(2) poll(2) epoll(7)

        3
  •  1
  •   Helmut Grohne    14 年前

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

        4
  •  0
  •   Victor Sorokin    14 年前

    OS API write()返回写入字节的计数。将此值与发送所有输入时可以看到的输入大小进行比较。

        5
  •  0
  •   Mahmoud Al-Qudsi    14 年前

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

        6
  •  0
  •   Karl Bielefeldt    14 年前

    你试过了吗 os.fsync(fd) ?