2009-02-23 16 views
6

miałem wrażenie, sed nie blokuje, bo kiedy ja mówię:Czy blokuje się sed?

iostat | sed 

sed przetwarza dane, ponieważ przybywa, ale kiedy robię

iostat | sed | netcat 

Następnie sed bloki netcat.

Mam rację?

Odpowiedz

14

sed będzie działać w trybie buforowym, gdy nie drukuje do terminala. Oznacza to, że będzie próbował wypełnić swój wewnętrzny bufor przed domyślnym przetworzeniem i wydrukiem.

Robi się to w celu zwiększenia przepustowości, ponieważ zwykle w rurze nie zależy Ci na czasie, ale chcesz, aby jak najwięcej danych było przetwarzanych w danym czasie.

Przekazanie -u do sed spowoduje, że będzie pracować w trybie niebuforowanym, dlatego działa tak samo, jak działa, gdy wyjście przechodzi do terminala.

+0

sed: nielegalną opcję - u – CommaToast

+0

@CommaToast: następnie użyć GNU sed lub dowiedzieć się, czy smak sed ma równoważną opcję (i po to tutaj jako odpowiedź, kiedy to robisz). –

+0

W moim kompu MacOSX brakuje '-u', ale' -l' działa na buforowanie linii, co jest preferowane. – Umbrella

1

ja nie wiem, czy rozumiem pytanie rację, ale w swoim przykładzie, powinno być tak:

  • sed czeka na iostat wysłać dane
  • iostat będzie czekać na sed do procesu dane jeśli sed jest powolny
  • netcat czeka na sed do wysyłania danych
  • sed będzie czekać na netcata ponownie, jeśli jest powolny

Poza tym, sed nie powinien potrzebować czytać wszystkich swoich danych wejściowych, aby wyprodukować dane wyjściowe.

Czy obserwuje się opóźnienia, których nie można wytłumaczyć, a niektóre niewielkie buforowanie?

3

Oprócz tego, co mówi @saua, sed jest co najmniej zorientowany liniowo, że czyta wiersz, a następnie operuje na nim, więc zawsze będzie buforował co najmniej jedną linię. Ponadto sed może pracować w trybie wielowierszowym. Jeśli używasz wzorca wielowierszowego, to sed nie może wyprowadzić bieżącego bufora dopóki nie będzie wiedział, że wzorzec albo nie ma zastosowania, albo wzorzec został przetworzony.

0

stdbuf może pomóc w zmianie zachowania buforowego standardowych strumieni io. Można próbować to zmienić zachowanie buforowania:

... | stdbuf -oL -eL sed -e ... | ... 
Powiązane problemy