Может ли чтение потоков с буферизацией строк дать несколько строк? - PullRequest
2 голосов
/ 25 мая 2020

При следующей настройке:

  • дочерний процесс был открыт для чтения (например, через popen())
  • дочерний процесс stdout был установлен в строку с буферизацией (_IOLBF)
  • родительские мониторы для данных о дочерних stdout (select(), poll() или epoll())
  • родители читают из дочерних stdout как только данные будут доступны (fgets() или getline())

Видя, как поток был настроен на строчную буферизацию, можем ли мы с уверенностью предположить, что будет только одна строка для чтения, или возможен ли сценарий ios, когда в буфере ожидает несколько строк, то есть мы должны вызывать fgets() или getline(), пока они не достигнут EOF (или EAGAIN / EWOULDBLOCK для неблокирующих потоков)?

1 Ответ

3 голосов
/ 25 мая 2020

можем ли мы с уверенностью предположить, что будет только одна строка для чтения, или возможен сценарий ios, когда в буфере ожидает несколько строк, что означает, что мы должны вызвать fgets() или getline(), пока они не наберут EOF (или EAGAIN / EWOULDBLOCK для неблокирующих потоков)?

Я украду соответствующую часть из этого ответа (то есть в свою очередь, связано со стандартом C11):

Когда поток буферизируется по строкам, символы предназначены для передачи в или из среды хоста в виде блока, когда встречается символ новой строки.

Таким образом, буферизация строки не означает, что все данные буферизуются в одной строке, но вместо этого данные отправляются, как только появляется новая строка.

Как следствие, ответ на ваш вопрос: возможны сценарии ios, в которых несколько строк ожидают чтения (в зависимости, конечно, от того, что на самом деле отправлено из вашего дочернего процесса).

...