读取行缓冲流可以产生多行吗?

问题描述 投票:0回答:1

给出以下设置:

  • 子进程已打开以供读取(例如通过popen()
  • 孩子的stdout已设置为行缓冲_IOLBF
  • 父母监视孩子的stdoutselect()poll()epoll())上的数据
  • 一旦数据可用(stdoutfgets()),父母将从孩子的getline()中读取

[查看流如何设置为行缓冲,我们可以安全地假设只有一行要读取,或者在缓冲区可能有多行等待的情况下,这意味着我们必须调用[ C0]或fgets(),直到达到getline()为止(对于非阻塞流,则为EOF / EAGAIN)?

c stream buffer
1个回答
2
投票

我们可以安全地假设只有一行可以读取,或者在缓冲区可能有多行等待的情况下,这意味着我们必须调用EWOULDBLOCKfgets()直到它们到达[C0 ](对于非阻塞流,则为getline() / EOF)?

我从EAGAIN中窃取了相关部分(又链接到C11标准):

当对行进行行缓冲时,当遇到换行符时,字符将作为块与主机环境进行传输。

因此,行缓冲并不意味着所有数据都被缓冲在一行中,而是在有新行时立即发送数据。

因此,您的问题的答案是可能正在等待读取多行的情况(当然,这取决于您的子进程实际发送的内容)。

© www.soinside.com 2019 - 2024. All rights reserved.