Я не очень хорошо понимаю, что вы пытаетесь спросить, но, как вам уже сказали, каналы не больше, чем буфер.
Исторически сложилось, что fifos (или каналы) использовали прямые блоки inode, используемые для их обслуживания, и они привязаны к файлу (с именем или нет) в некоторой файловой системе.
Сегодня я не знаю точных деталей реализации для fifo, но в основном ядро буферизует все данные, которые писатели уже написали, но читатели еще не прочитали. У fifo есть верхний предел (определенный системой) для объема буфера, который они могут поддерживать, но обычно он терпит неудачу около 10-20 КБ данных.
Ядро буферизуется, но между писателями и читателями нет задержки, потому что как только писатель пишет по каналу, ядро пробуждает всех читателей, ожидающих получения данных. Обратное также верно в том случае, если канал заполняется данными, как только читатель использует их, все авторы просыпаются, чтобы допустить их повторное заполнение.
В любом случае, ваш вопрос о промывке не имеет ничего общего с трубами (ну, не так, позвольте мне объяснить), но с пакетом <stdio.h>
. <stdio.h>
делает буфер и обрабатывает буферизацию для каждого FILE *
индивидуально, поэтому у вас есть вызовы для очистки буферов, когда вы хотите, чтобы они были write(2)
n на диск.
обладает динамическим поведением, которое позволяет оптимизировать буферизацию и не заставлять программистов каждый раз выполнять сброс. Это зависит от типа дескриптора файла, связанного с указателем FILE *
.
Когда указатель FILE *
связан с последовательным tty (он проверяет, что вызов на isatty(3)
вызов, который внутренне делает вызов ioctl(2)
, позволяет <stdio.h>
видеть, если вы против последовательного устройства , устройство char. Если это происходит, то <stdio.h>
выполняет строковую буферизацию , что означает, что всегда, когда на устройство выводится символ '\n'
, буфер автоматически буферизуется.
Это предполагает проблему оптимизации, потому что, когда, например, вы используете cat(1)
для копирования файла, самый большой буфер обычно предполагает наиболее эффективный подход. Ну, <stdio.h>
приходит, чтобы решить проблему, потому что, когда вывод не является устройством tty, он выполняет полную буферизацию и очищает только внутренние буферы указателя FILE *
, когда он полон данных.
Итак, вопрос: как <stdio.h>
ведет себя с узлом fifo (или pipe)? Ответ прост .... is is not char device (или tty), поэтому <stdio.h>
выполняет полную буферизацию на нем. Если вы обмениваетесь данными между двумя процессами и хотите, чтобы читатель получил данные, как только вы их printf(3)
отредактировали, тогда вам лучше набрать fflush(3)
, потому что если вы этого не сделаете, вы можете ждать ответ, который никогда не приходит, потому что то, что вы написали, еще не было написано (не ядром, а библиотекой <stdio.h>
)
Как я уже сказал, я не знаю, является ли это именно ответом на ваш вопрос, но наверняка он может дать вам подсказку о том, где может быть проблема.