Как в портативном С искать вперед при чтении из трубы - PullRequest
9 голосов
/ 27 апреля 2011

Поскольку fseek() не работает на каналах, какие существуют методы для имитации поиска вперед?Наивный подход заключается в использовании fread() и отбрасывании содержимого, считанного в буфер памяти.Для огромных попыток избежать огромных буферов вы должны использовать один и тот же буфер снова и снова с окончательным чтением, используя только часть буфера.Есть ли другой способ избежать буфера и потенциального многократного чтения?

Ответы [ 2 ]

6 голосов
/ 27 апреля 2011

Поиск не имеет смысла на каналах, потому что ввод создается динамически (не сохраняется на диске).Системный вызов ядра lseek не реализован для каналов.

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

5 голосов
/ 27 апреля 2011

Да, это единственный способ.Я бы использовал буфер где-то около 1k-8k.С гораздо меньшими издержками syscall для чтения вступят в игру, а с гораздо большими вы извлечете полезные данные из кэша.

...