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

标签 c stream buffer

给出以下设置:

  • 子进程已打开以供读取(例如通过 popen())
  • 子项的 stdout 已设置为行缓冲 (_IOLBF)
  • 父级监视子级 stdout 上的数据(select()poll()epoll() )
  • 一旦数据可用(fgets()getline()), parent 就会从 child 的 stdout 中读取

查看流如何设置为行缓冲,我们是否可以安全地假设只有一行可供读取,或者是否存在缓冲区中有多行等待的情况,这意味着我们必须调用fgets()getline() 直到遇到 EOF (或 EAGAIN/EWOULDBLOCK) > 对于非阻塞流)?

最佳答案

can we safely assume that there will only ever be one single line to read, or are there possible scenarios where there are multiple lines waiting in the buffer, meaning we have to call fgets() or getline() until they hit EOF (or EAGAIN / EWOULDBLOCK for non-blocking streams)?

我从this answer盗取了相关部分(这又链接到 C11 标准):

When a stream is line buffered, characters are intended to be transmitted to or from the host environment as a block when a new-line character is encountered.

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

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

关于读取行缓冲流可以产生多行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62001447/

相关文章:

c - 验证一个人是否存在的函数[比较 C 中的字符串]

c - 如何使用 C 中的信号同步两个进程(子进程和父进程)?

c++ - 从文件读取错误(读取 0 或 ""值)

swift - 如何使用组合将异步加速度计更新发送到服务器

c++ - 将缓冲区与另一个缓冲区连接

c - 优化 C 中的按位运算

c++ - 如何使用 OpenSSL API 从其 PEM 格式字符串中读取 RSA 公钥?

java - Java 中的 printf() 功能与 CharBuffer 或类似的东西相结合

java - 创建垃圾文件来代替已删除的文件

json - nodejs JSON.parse(data_from_TCP_socket)