Блокировка седа? - PullRequest
       27

Блокировка седа?

11 голосов
/ 23 февраля 2009

У меня сложилось впечатление, что sed не блокирует, потому что, когда я говорю:

iostat | sed

sed обрабатывает данные по мере их поступления, но когда я делаю

iostat | sed | netcat

Тогда sed блоков netcat.

Я прав?

Ответы [ 4 ]

19 голосов
/ 23 февраля 2009

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

Это сделано для увеличения пропускной способности, потому что обычно в канале вы не заботитесь о синхронизации, но хотите, чтобы как можно больше данных обрабатывалось в данный момент времени.

Передача -u в sed скажет, что он работает без буферизации, поэтому работает так же, как и при выводе на терминал.

3 голосов
/ 23 февраля 2009

В дополнение к тому, что говорит @saua, sed, по крайней мере, ориентирован на строку, что он читает строку, а затем обрабатывает ее, поэтому он всегда будет буферизовать хотя бы одну строку. Кроме того, sed может работать в многострочном режиме. Если вы используете многострочный шаблон, sed не сможет вывести свой текущий буфер, пока не узнает, что шаблон либо не применяется, либо шаблон был обработан.

1 голос
/ 23 февраля 2009

Я не знаю, правильно ли я понимаю вопрос, но в вашем примере это должно быть так:

  • sed ждет, пока iostat отправит данные
  • iostat будет ждать, пока sed обработает данные, если sed работает медленно
  • netcat ждет, когда sed отправит данные
  • sed снова будет ждать netcat, если он медленный

Кроме этого, sed не нужно читать все свои входные данные для получения выходных данных.

Наблюдаете ли вы какие-либо задержки, которые не могут быть объяснены этим и небольшой буферизацией?

0 голосов
/ 10 февраля 2016

stdbuf может помочь с изменением режима буферизации стандартных потоков ввода / вывода. Вы можете попробовать это изменить поведение буферизации:

... | stdbuf -oL -eL sed -e ... | ...
...