выследит с передачей по каналу чтения целый файл?

[1125985] по совету моего брата, я скопировал $HOME/.pulse/ и $HOME/. pulse-cookie с [1126478]jcomeau[1126479] на [1126480]petalumarentals[1126481], [1126482]chown[1126483]ing их на [1126484]petalumarentals[1126485], и оба SoX [1126486]play[1126487] и [1126488]alsamixer[1126489] теперь работают одинаково на обоих счетах. Должен быть лучший способ настроить это, но он работает как есть[1125986].
1
28.02.2014, 05:55
2 ответа

tail умрет из-за сигнала SIGPIPE, как только он попытается записать в канал, когда у него нет считывателя.

Итак, tail умрет вскоре после того, как head завершит вывод своих 10000 строк и завершит работу.

Поскольку каналы могут содержать некоторые данные (64 КБ в Linux) и поскольку tail буферизует свой вывод, когда не на терминал (8 КБ в моем тесте), а head и tail считывают ввод по частям (до 8 КБ в моих тестах), tail может читать до 64 + 8 + 8 КБ после конца 10000-й строки после смещения перед смертью.

Наихудший сценарий - когда head опорожняет трубу медленнее, чем tail - это заполнение (например, при записи на медленный вывод, такой как терминал), и если последний байт 10000-й строки находится в начале блока размером 8 кБайт.

Затем, в конце концов, head прочитает блок с последней новой строкой в ​​начале (на 8191 байт больше, чем необходимо), но будет занят записью своего вывода. tail , за это время заполнивший канал (64 КБ), прочитал еще один блок размером 8 КБ, но, когда канал заполнен, запись в него блокируется. Как только head запишет свою последнюю строку и завершится, tail умрет, но прочитает 64 КБ + 8 КБ + 8191 байт после последней из этих 10000 строк.

Наилучший сценарий - когда последняя из 10000 строк находится в самом конце блока 8kiB и head считывает данные, как только они помещаются в конвейер tail .Затем, если в последнем блоке head удастся прочитать его из конвейера и выйти до того, как tail запишет следующий блок, то tail умрет после записи следующий блок, поэтому он будет читать только 8192 байта после конца этой 10000-й строки.

Предполагается, что somefile является обычным файлом. Он мог бы завершиться раньше, если бы somefile был неким королем специального файла, который, например, переходит по одному байту за раз (например, канал из while:; do echo; done )

4
27.01.2020, 23:21

Нет. И вывод труб не повлияет на то, что читается на хвосте.

С опцией смещения вашего символа -c + offset tail будет искать позицию, а затем читать с этой точки.

0
27.01.2020, 23:21

Теги

Похожие вопросы