【发布时间】:2019-08-21 16:00:57
【问题描述】:
如果我们在管道中有 20 个字节,我们读取 30 个字节。读取会等待丢失的 10 个字节还是会继续?
【问题讨论】:
如果我们在管道中有 20 个字节,我们读取 30 个字节。读取会等待丢失的 10 个字节还是会继续?
【问题讨论】:
如果写入文件描述符关闭,POSIX read 调用将是非阻塞的,并返回 0 表示文件结束。
如果不是这种情况,则取决于您的管道文件描述符。一般来说,O_NONBLOCK 文件状态标志决定了当读取的数据多于打开文件描述符的缓冲区中可用数据时的行为,因为它决定描述符是否处于阻塞模式,per POSIX fcntl.h header:
O_NONBLOCK
非阻塞模式。
如果你在文件描述符上设置了这个标志(对于使用fcntl函数的管道),管道是非阻塞的,否则阻塞。
这在the read POSIX function specification中有更正式的规定:
尝试从空管道或 FIFO 中读取时:
如果没有进程打开管道进行写入,read() 应返回 0 表示文件结束。
如果某个进程打开了写入管道并且设置了 O_NONBLOCK,read() 将返回 -1 并将 errno 设置为 [EAGAIN]。
如果某个进程打开了用于写入的管道并且 O_NONBLOCK 已清除,read() 将阻塞调用线程,直到某些数据被写入或管道被所有打开管道的进程关闭写作。
因此,您的具体问题的答案是:视情况而定。
【讨论】: