Какие буферы существуют между командами в конвейере?

Я думал, что это 1 буфер, но теперь мне приходит в голову, что это может быть 2.

Я имею в виду в конвейере:

cmd1 | cmd2

Вывод cmd2 может быть, например. линия буферизована и конвейера там нет. Это должен быть буфер, управляемый потоковыми функциями libc FILE *, такими как fwrite(), или этот буфер также используется write(3)? Однако я только что вспомнил, что pipe(7) говорит о размере конвейерных буферов, которые, по-видимому, контролируются ядром.

Стандартный ввод тоже буферизован? Есть ли 3 буфера, 1 в пространстве ядра и 2 в пространстве пользователя?

Раньше я думал, что read(2) зависает, когда конвейерный буфер пуст, но когда stdin является не конвейером, а скорее терминалом, конвейерного буфера нет, верно? Если у него нет собственного буфера, проверяет ли он разные буферы в зависимости от того, является ли стандартный ввод каналом, терминалом или обычным файлом?

РЕДАКТИРОВАТЬ: Изменено «сколько» на «что» в вопросе. Надеюсь, это не слишком большое изменение. Мне интересно знать, что такое буферы, а не просто число.


person JoL    schedule 20.06.2018    source источник


Ответы (1)


Стандартный ввод тоже буферизован? Есть ли 3 буфера, 1 в пространстве ядра и 2 в пространстве пользователя?

Да, вообще здесь может быть 3 буфера: один для cmd1 stdout, один для cmd2 stdin и один в пространстве ядра.

Раньше я думал, что read(2) зависает, когда конвейерный буфер пуст, но когда stdin является не конвейером, а скорее терминалом, конвейерного буфера нет, верно?

Системный вызов read блокируется при отсутствии ввода, но это не имеет ничего общего с stdio буферизацией.

Буфер ядра существует независимо от того, поступает ли ввод с терминала или нет (для ядра было бы очень неэффективно передавать по одному символу за раз).

По по умолчанию библиотека stdio не буферизует ввод терминала, но приложение может изменить это с помощью явных вызовов, например, setvbuf.

Сообщение в блоге с более подробной информацией находится здесь.

person Employed Russian    schedule 21.06.2018