我的 Python 程序需要从多个不同的文件描述符中多路读取。其中一些是子进程的 stdout/stderr 描述符;inotify
其他是与调用关联的文件描述符。
我的问题是能够在select()
. 根据文档,select()
报告已准备好写入的套接字“保证不会阻塞最多 PIPE_BUF 字节的写入”。
我认为读取没有这样的保证是有意义的,因为select()
报告内核管道缓冲区中有数据等待准备好并不意味着您可以继续执行 to .read(socket.PIPE_BUF)
,因为那里可能只有几个字节。
这意味着当我调用read()
套接字时,我可以得到实际上是死锁,因为一些子进程很少产生输出。
有没有办法解决?我目前的解决方法是调用readline()
它,我很幸运,我从中读取的所有内容都有逐行输出。从这样的管道读取时是否select()
有任何用处,因为无法知道您可以在不阻塞的情况下安全地读取多少字节?
[1] 我知道这与 O_NONBLOCK 套接字不同