Jak mogę kontynuować czytanie z rury, nawet po jej zamknięciu?


5

Mam skrypt ksh, który wywołuje:

while read LINE do...

Dane wejściowe zostały przekierowane (nie pokazano), dzięki czemu można odczytać dane wejściowe z potoku.

Problem polega na tym, że gdy piszący do potoku zamyka się, read zwraca false i wychodzi z pętli.

Chcę, aby nadal czytał po zamknięciu potoku (proces pisania może się od czasu do czasu uruchamiać ponownie, powodując taką sytuację).

Próbowałem owijać całą LINIĘ do odczytu w podpowłokę i zapętlać całą podpowłokę, ale czytać po prostu otrzymuje pustą linię po zamknięciu potoku zamiast blokować, dopóki nie będzie więcej danych wejściowych, jak ma to miejsce przy normalnym uruchomieniu skryptu.

Odpowiedzi:


6

W jądrze tworzony jest potok jako metoda komunikacji między dwoma procesami. Zazwyczaj jest to związek rodzic / dziecko. Jeśli proces się zakończy, nie ma rury. Nie ma sposobu, aby dołączyć inny proces do drugiego końca potoku w jądrze. Jądro automatycznie rozpoczyna zamykanie potoku i przekazuje EPIPE wszystkim czytelnikom.

Co można zrobić, choć jest utworzyć nazwanego potoku . Istnieje w systemie plików i nie jest zamykany po wyjściu z dowolnego programu piszącego. Możesz nawet mieć wielu pisarzy na potoku, choć nie sugeruję tego - „fragmenty”, które, jak myślisz, piszą, są zapisywane w różnych częściach z powodu buforowania.

Tworzysz potok w znanym katalogu za pomocą mkfifo /path/to/pipei przekierowujesz stdin lub stdout z / do niego, w zależności od tego, czy jesteś czytelnikiem czy pisarzem.


0

Po zamknięciu rury nie można jej ponownie otworzyć. Nie znam wszystkich szczegółów dotyczących nazwanych potoków w systemie plików, ale jeśli robisz coś takiego, cat somefile.txt | myprogramgdy tylko catzamkniesz potok, potok zniknie.


>nie jest fajką. Jest to specyfikator przekierowania wyjścia.
amfetamachina

@amphetamachine: Whooops. Dzięki za złapanie tego
Darth Android
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.