Eine Pipe ist eine lange Röhre, die viele Daten enthält. Wenn das empfangende Ende der Pipe aufhört, die Daten herauszuziehen, wird eine Sicherungskopie erstellt, und die Pipe platzt. Der Computer informiert das Ende, das Daten in die Pipe stopft, dass dies geschehen ist.
Omnifarious
Antworten:
7
Eine Pipe ist einfach ein IPC-Mechanismus (Interprozesskommunikation), mit dem die Standardausgabe eines Prozesses mit der Standardeingabe eines anderen Prozesses verbunden wird.
Ein Beispiel ist, wenn Sie eine Datei nach dem Wort "pax" durchsuchen möchten:
cat filename | grep pax
und ja, ich weiß, Sie können grepdie Datei direkt, aber das erklärt nicht, wie es funktioniert, oder?
Dies verbindet die Standardausgabe des catBefehls mit der Standardeingabe des grepBefehls. catSendet den Inhalt der Datei an die Standardausgabe und grepliest die Datei (in diesem Fall) von der Standardeingabe. Indem Sie Prozesse auf diese Weise miteinander verbinden, können Sie Ihre eigenen Werkzeuge erstellen, die aus einer beliebigen Anzahl von Rohrsegmenten bestehen. Dinge wie:
Eine defekte Pipe ist eine Pipe, bei der (normalerweise) der Empfänger der Daten die Verbindung geschlossen hat, während der Absender noch versucht, Daten zu senden.
Wenn Sie beispielsweise eine große Datei über ein Pager-Programm senden (um sie seitenweise anzuzeigen):
cat myfile | pager
Wenn Sie dann a ausführen CTRL-BREAK, kann dies dazu führen, dass der pagerProzess seine Eingangsleitung herunterfährt, bevor er nicht mehr catverwendet wird. Das ist eine Möglichkeit, dieses kaputte Rohr zu bekommen.
Aus einer flüchtigen Google-Suche geht hervor , dass dieses bestimmte Problem mit Ad-hoc-Bereitstellungen zusammenhängt. Zu den angegebenen Lösungen gehört normalerweise das Beenden eines Großteils Ihrer Software und das Neustarten der meisten Geräte.
Dies ist wahrscheinlich schwerwiegend genug, um das Problem Apple zu melden. Je mehr Entwickler sich darüber beschweren, desto wahrscheinlicher wird etwas unternommen, um das Problem zu beheben.
pr -e4 -n ten-thousand-lines.c | sed 10qendet mit einem Rohrbruch. Ob prbothers Ihnen zu sagen , dass es bekam das SIGPIPE Signal eine andere Sache; es kann durchaus einfach als Ergebnis des Signals verlassen werden (was einen Nicht-Null-Austrittsstatus erzeugt).
Jonathan Leffler
Rohre verbinden nicht notwendigerweise den "Standard" -Eingang und -Ausgang. Es ist programmgesteuert möglich, E / A-Vorgänge durch eine Pipe zu leiten, obwohl Sie von der Befehlszeile aus richtig sind.
CarlF
2
Der |Charakter wird oft Pipe genannt. In den verschiedenen UNIX-Shells (von denen ich weiß) kann es verwendet werden, um die Ausgabe eines Befehls an die Eingabe eines anderen zu leiten.
cat myfile.txt | head
Der headBefehl zeigt nur die ersten Zeilen seiner Eingabe an. Zu diesem Zeitpunkt wird die Eingabe geschlossen. Dies ist ein Problem für den Befehl, der die Eingabe generiert hat. Wohin schreibt es? Immer wenn wir diese Situation haben oder wenn der Schreibvorgang endet, bevor der Leser fertig ist, spricht man von einer "kaputten Pipe".
Um zu verhindern, dass der catBefehl für immer andauert , definiert der UNIX-Standard ein spezielles Signal ( SIGPIPE , Signal 13 ), an das er gesendet wird cat. Die Standardaktion für dieses Signal ist, den Prozess catabzubrechen , was das Ende angenehm macht.
Anscheinend hat die von Ihnen verwendete Anwendung einen Signal-Handler für alle Signale installiert, einschließlich SIGPIPE, der die kleine Popup-Meldung erstellt, die Sie sehen.
Dieser Fehler scheint ziemlich oft aufzutreten.
/programming/490366/ad-hoc-deployment-issue-putpkt-write-failed-broken-pipe
Es ist "... ein interner Fehler in der Fähigkeit von Xcode, mit Ihrem Telefon zu sprechen. Es funktioniert nicht Ich meine, Sie haben etwas falsch gemacht, es ist ein Fehler im Entwicklungssystem. "
Eine Pipe ist ein IPC-Mechanismus auf Unix-Systemen. Eine Pipe hat zwei Enden, ein Leseende und ein Schreibende. In das Schreibende geschriebene Daten können vom Leseende gelesen werden und werden in der Reihenfolge ausgegeben, in der sie geschrieben wurden.
In der Unix-Kommandozeilenwelt sind Pipes eine sehr verbreitete Methode, Programme zusammenzufügen, um einen Job zu erledigen. Zum Beispiel sed 's/foo/bar/g' fred.txt | grep -e 'bar.*baz'wird in der Datei gelesen, fred.txtdass alle Instanzen der Zeichenfolge foodurch die Zeichenfolge ersetzt werden. barDann wird das Ergebnis nach Zeilen durchsucht, die bargefolgt von einer bestimmten Anzahl von Zeichen enthalten baz.
Das scheint natürlich nicht besonders nützlich zu sein. Aber ich bin sicher, wenn Sie darüber nachdenken, können Sie sehen, wie Sie das für alle möglichen interessanten Zwecke einsetzen können, besonders wenn Sie Programme wie awkoder perlzur Verfügung haben.
Das Rohrsystem war von Anfang an ein Teil von Unix. Wenn ein Prozess in Ihrer Pipeline beendet wird, möchten Sie normalerweise, dass alle Programme in der Pipeline beendet werden. Dies bedeutet, dass standardmäßig ein Prozess, der in eine Pipe schreibt, in der der Prozess am Leseende nicht mehr vorhanden ist, ein SIGPIPESignal erhält . Und wenn es dieses Signal blockiert, schlägt das writeimmer noch mit einer besonderen Art von Fehler fehl, der darauf hinweist, dass das Rohr „gebrochen“ ist.
Die Standardbehandlung von beendet SIGPIPEden Prozess, der es empfängt. Und wenn es nicht der "Kopf" der Pipeline ist, SIGPIPEbreitet sich das Ganze entlang der Kette aus.
Was Xcode beanstandet, ist, dass es ein Unterprogramm gestartet hat, um etwas mit einer dazu führenden Pipe zu tun, und dass dieses Unterprogramm unerwartet abgestorben ist und die Pipe gebrochen hat.
Eine "kaputte" Pipe ist eine Pipe, von der ein Ende close()gelesen oder in die das andere geschrieben wird. Zum Beispiel im folgenden Shell-Befehl:
cat foo | less
Der catProzess hält das schreibende Ende der Pipe und der lessProzess das lesende. Wenn der Leseprozess die Pipe schließt, ist die Pipe unterbrochen (und daher unbrauchbar). Der Writer-Prozess erhält den Fehler "broken pipe" vom Betriebssystem.
Eigentlich ist es nur "kaputt", wenn der Leser es schließt. Wenn der Schreiber es schließt (wie es catoffensichtlich wird, sobald es fertig ist), sieht der Leser nur ein normales Dateiende.
Random832
Ups, Sie haben absolut Recht ... Ich werde meine Antwort aktualisieren.
Antworten:
Eine Pipe ist einfach ein IPC-Mechanismus (Interprozesskommunikation), mit dem die Standardausgabe eines Prozesses mit der Standardeingabe eines anderen Prozesses verbunden wird.
Ein Beispiel ist, wenn Sie eine Datei nach dem Wort "pax" durchsuchen möchten:
und ja, ich weiß, Sie können
grep
die Datei direkt, aber das erklärt nicht, wie es funktioniert, oder?Dies verbindet die Standardausgabe des
cat
Befehls mit der Standardeingabe desgrep
Befehls.cat
Sendet den Inhalt der Datei an die Standardausgabe undgrep
liest die Datei (in diesem Fall) von der Standardeingabe. Indem Sie Prozesse auf diese Weise miteinander verbinden, können Sie Ihre eigenen Werkzeuge erstellen, die aus einer beliebigen Anzahl von Rohrsegmenten bestehen. Dinge wie:Eine defekte Pipe ist eine Pipe, bei der (normalerweise) der Empfänger der Daten die Verbindung geschlossen hat, während der Absender noch versucht, Daten zu senden.
Wenn Sie beispielsweise eine große Datei über ein Pager-Programm senden (um sie seitenweise anzuzeigen):
Wenn Sie dann a ausführen CTRL-BREAK, kann dies dazu führen, dass der
pager
Prozess seine Eingangsleitung herunterfährt, bevor er nicht mehrcat
verwendet wird. Das ist eine Möglichkeit, dieses kaputte Rohr zu bekommen.Aus einer flüchtigen Google-Suche geht hervor , dass dieses bestimmte Problem mit Ad-hoc-Bereitstellungen zusammenhängt. Zu den angegebenen Lösungen gehört normalerweise das Beenden eines Großteils Ihrer Software und das Neustarten der meisten Geräte.
Dies ist wahrscheinlich schwerwiegend genug, um das Problem Apple zu melden. Je mehr Entwickler sich darüber beschweren, desto wahrscheinlicher wird etwas unternommen, um das Problem zu beheben.
quelle
pr -e4 -n ten-thousand-lines.c | sed 10q
endet mit einem Rohrbruch. Obpr
bothers Ihnen zu sagen , dass es bekam das SIGPIPE Signal eine andere Sache; es kann durchaus einfach als Ergebnis des Signals verlassen werden (was einen Nicht-Null-Austrittsstatus erzeugt).Der
|
Charakter wird oft Pipe genannt. In den verschiedenen UNIX-Shells (von denen ich weiß) kann es verwendet werden, um die Ausgabe eines Befehls an die Eingabe eines anderen zu leiten.Der
head
Befehl zeigt nur die ersten Zeilen seiner Eingabe an. Zu diesem Zeitpunkt wird die Eingabe geschlossen. Dies ist ein Problem für den Befehl, der die Eingabe generiert hat. Wohin schreibt es? Immer wenn wir diese Situation haben oder wenn der Schreibvorgang endet, bevor der Leser fertig ist, spricht man von einer "kaputten Pipe".Um zu verhindern, dass der
cat
Befehl für immer andauert , definiert der UNIX-Standard ein spezielles Signal ( SIGPIPE , Signal 13 ), an das er gesendet wirdcat
. Die Standardaktion für dieses Signal ist, den Prozesscat
abzubrechen , was das Ende angenehm macht.Anscheinend hat die von Ihnen verwendete Anwendung einen Signal-Handler für alle Signale installiert, einschließlich SIGPIPE, der die kleine Popup-Meldung erstellt, die Sie sehen.
quelle
Dieser Fehler scheint ziemlich oft aufzutreten. /programming/490366/ad-hoc-deployment-issue-putpkt-write-failed-broken-pipe Es ist "... ein interner Fehler in der Fähigkeit von Xcode, mit Ihrem Telefon zu sprechen. Es funktioniert nicht Ich meine, Sie haben etwas falsch gemacht, es ist ein Fehler im Entwicklungssystem. "
quelle
Eine Pipe ist ein IPC-Mechanismus auf Unix-Systemen. Eine Pipe hat zwei Enden, ein Leseende und ein Schreibende. In das Schreibende geschriebene Daten können vom Leseende gelesen werden und werden in der Reihenfolge ausgegeben, in der sie geschrieben wurden.
In der Unix-Kommandozeilenwelt sind Pipes eine sehr verbreitete Methode, Programme zusammenzufügen, um einen Job zu erledigen. Zum Beispiel
sed 's/foo/bar/g' fred.txt | grep -e 'bar.*baz'
wird in der Datei gelesen,fred.txt
dass alle Instanzen der Zeichenfolgefoo
durch die Zeichenfolge ersetzt werden.bar
Dann wird das Ergebnis nach Zeilen durchsucht, diebar
gefolgt von einer bestimmten Anzahl von Zeichen enthaltenbaz
.Das scheint natürlich nicht besonders nützlich zu sein. Aber ich bin sicher, wenn Sie darüber nachdenken, können Sie sehen, wie Sie das für alle möglichen interessanten Zwecke einsetzen können, besonders wenn Sie Programme wie
awk
oderperl
zur Verfügung haben.Das Rohrsystem war von Anfang an ein Teil von Unix. Wenn ein Prozess in Ihrer Pipeline beendet wird, möchten Sie normalerweise, dass alle Programme in der Pipeline beendet werden. Dies bedeutet, dass standardmäßig ein Prozess, der in eine Pipe schreibt, in der der Prozess am Leseende nicht mehr vorhanden ist, ein
SIGPIPE
Signal erhält . Und wenn es dieses Signal blockiert, schlägt daswrite
immer noch mit einer besonderen Art von Fehler fehl, der darauf hinweist, dass das Rohr „gebrochen“ ist.Die Standardbehandlung von beendet
SIGPIPE
den Prozess, der es empfängt. Und wenn es nicht der "Kopf" der Pipeline ist,SIGPIPE
breitet sich das Ganze entlang der Kette aus.Was Xcode beanstandet, ist, dass es ein Unterprogramm gestartet hat, um etwas mit einer dazu führenden Pipe zu tun, und dass dieses Unterprogramm unerwartet abgestorben ist und die Pipe gebrochen hat.
quelle
Eine "kaputte" Pipe ist eine Pipe, von der ein Ende
close()
gelesen oder in die das andere geschrieben wird. Zum Beispiel im folgenden Shell-Befehl:Der
cat
Prozess hält das schreibende Ende der Pipe und derless
Prozess das lesende. Wenn der Leseprozess die Pipe schließt, ist die Pipe unterbrochen (und daher unbrauchbar). Der Writer-Prozess erhält den Fehler "broken pipe" vom Betriebssystem.quelle
cat
offensichtlich wird, sobald es fertig ist), sieht der Leser nur ein normales Dateiende.