Oto kilka opcji, o których myślałem, ale nie jestem pewien, która z nich jest właściwa.
- Wystąpił błąd we / wy podczas odczytu z potoku.
- Proces zapisu na drugim końcu potoku umarł z powodu awarii.
- Wszystkie procesy, które mogły pisać do potoku, zamknęły go.
- Bufor zapisu potoku jest pełny.
- Element równorzędny zamknął drugi kierunek rury dupleksowej.
- Zapis nie powiódł się, ponieważ nie ma procesów, które mogłyby odczytać z potoku.
- Wywołanie systemowe zwróciło błąd EPIPE i nie zainstalowano programu obsługi błędów.
Odpowiedzi:
Proces otrzymuje SIGPIPE, gdy próbuje zapisać do potoku (nazwanego lub nie) lub gniazda typu SOCK_STREAM, w którym nie ma już czytnika.
To ogólnie pożądane zachowanie. Typowym przykładem jest:
Nie chcesz
find
kontynuować działania pohead
zakończeniu (a następnie zamknięciu jedynego deskryptora pliku otwartego do odczytu na tym potoku).yes
Komenda zazwyczaj polega na tym sygnałem do zakończenia.Napiszę „y”, dopóki jakieś polecenie się nie zakończy.
Zauważ, że to nie tylko po wyjściu komend, ale także wtedy, gdy wszyscy czytelnicy zamknęli czytanie fd do potoku. W:
Będzie 1 (podpowłoka), następnie 2 (podpowłoka + uśpienie), następnie 1 (podpowłoka), a następnie 0 odczytanie fd z potoku po tym, jak podpowłoka wyraźnie zamknie swoje standardowe wejście, i wtedy
yes
otrzyma SIGPIPE.Powyżej, większość powłok użyć
pipe(2)
podczasksh93
używasocketpair(2)
, ale zachowanie jest taka sama w tym względzie.Gdy proces ignoruje SIGPIPE, wywołanie systemowe piśmie (ogólnie
write
, ale może byćpwrite
,send
,splice
...) wraca zEPIPE
błędem. Tak więc procesy, które chcą ręcznie obsługiwać uszkodzoną rurę, zwykle ignorują SIGPIPE i podejmują działania po błędzie EPIPE.źródło
(6)
Chociaż, chyba że powielisz deskryptory i rozwidlenie, na początku może być tylko jeden proces: ogólnie potok ma jeden czytnik i jeden program piszący, a gdy jeden z nich zamyka połączenie, potok jest nieczynny. Jeśli używasz nazwanego potoku, możesz z nim wykonywać wiele połączeń (szeregowo), ale każde z nich reprezentuje nowy potok w tym sensie. Zatem „potok” do wątku lub procesu jest synonimem deskryptora pliku.
Od
man 7 pipe
:„Złamana rura” jest więc dla pisarza tym, czym EOF jest dla czytelnika.
źródło
Przerwana rura zdarza się, gdy proces odczytu kończy się przed procesem zapisu. Więc poszedłbym z (6)
źródło