Hier sind einige Optionen, die ich mir überlegt habe. Ich bin mir nicht sicher, welche die richtige ist.
- In der Pipe ist ein E / A-Fehler aufgetreten.
- Das Schreiben auf das andere Ende der Pipe ist fehlgeschlagen.
- Alle Prozesse, die in die Pipe schreiben konnten, haben sie geschlossen.
- Der Schreibpuffer der Pipe ist voll.
- Der Peer hat die andere Richtung des Duplex-Pipes geschlossen.
- Das Schreiben ist fehlgeschlagen, weil es keine Prozesse gibt, die von der Pipe lesen könnten.
- Ein Systemaufruf hat den EPIPE-Fehler zurückgegeben, und es wurde kein Fehlerbehandlungsprogramm installiert.
Antworten:
Ein Prozess empfängt ein SIGPIPE, wenn er versucht, in eine Pipe (mit oder ohne Namen) oder einen Socket vom Typ SOCK_STREAM zu schreiben, für die kein Leser mehr vorhanden ist.
Es ist im Allgemeinen gewolltes Verhalten. Ein typisches Beispiel ist:
Sie möchten nicht
find
weiterlaufen, wennhead
das Programm beendet wurde (und dann den einzigen Dateideskriptor geschlossen hat, der zum Lesen in dieser Pipe geöffnet ist).Der
yes
Befehl verlässt sich normalerweise auf dieses Signal, um zu beenden.Schreibt "y", bis ein Befehl beendet wird.
Beachten Sie, dass dies nicht nur beim Beenden von Befehlen der Fall ist, sondern auch, wenn alle Leser ihre Lese-FD für die Pipe geschlossen haben. Im:
Es wird 1 (die Subshell) geben, dann 2 (Subshell + Sleep), dann 1 (Subshell) und dann 0 fd, die aus der Pipe gelesen werden, nachdem die Subshell ihre Standard-ID explizit geschlossen
yes
hat. Dann wird eine SIGPIPE empfangen.Oben verwenden die meisten Shells eine
pipe(2)
Weileksh93
asocketpair(2)
, aber in dieser Hinsicht ist das Verhalten dasselbe.Wenn ein Prozess die SIGPIPE ignoriert, rufen Sie das Schreibsystem ( in der Regel
write
, könnte aber seinpwrite
,send
,splice
...) kehrt mit einemEPIPE
Fehler. Daher ignorieren Prozesse, die die unterbrochene Leitung manuell behandeln möchten, normalerweise SIGPIPE und ergreifen Maßnahmen bei einem EPIPE-Fehler.quelle
(6)
Wenn Sie Deskriptoren und Fork nicht duplizieren, kann es am Anfang nur einen Prozess geben: Im Allgemeinen verfügt eine Pipe über einen Reader und einen Writer. Wenn einer von ihnen die Verbindung schließt, ist die Pipe nicht mehr funktionsfähig. Wenn Sie eine Named Pipe verwenden, können Sie mehrere (serielle) Verbindungen damit herstellen, aber jede repräsentiert in diesem Sinne eine neue Pipe. Eine "Pipe" zu einem Thread oder Prozess ist also gleichbedeutend mit einem Dateideskriptor.
Von
man 7 pipe
:Eine "kaputte Pfeife" ist für den Schreiber das, was EOF für den Leser ist.
quelle
Eine unterbrochene Pipe tritt auf, wenn der Lesevorgang vor dem Schreibvorgang beendet wird. Also würde ich gehen mit (6)
quelle