Frage

Ich habe einige grundlegende Fragen zu Rohren, über die ich mir nicht sicher bin.

a) Was ist das Standardverhalten, wenn ein Prozess, der in eine Pfeife schreibt, getötet wird (dh Sigkill SIGINT), schließt es das Rohr? Spült es das Rohr? Oder ist das Verhalten undefiniert?

b) Was ist das Standardverhalten, wenn ein Prozess normal zurückkehrt? Ist es garantiert, das Rohr zu spülen und das Rohr zu schließen? (ohne dies natürlich ausdrücklich).

Ich möchte, dass diese Antworten so allgemein wie möglich sein, aber in Wirklichkeit, wenn es ganz von den Betriebssystemspezifikationen abhängt, kann ich das akzeptieren! Wenn es jedoch einen POSIX -Standard oder ein aktuell definiertes Windows -Verhalten gibt, wäre ich sehr dankbar.

Vielen Dank.

War es hilfreich?

Lösung

a. Was ist das Standardverhalten, wenn ein Prozess, der in eine Pfeife schreibt, getötet wird (dh Sigkill SIGINT), schließt es die Pfeife? Spült es das Rohr? Oder ist das Verhalten undefiniert?

Sigkill erlaubt niemals eine Reinigung - der Prozess stirbt tot. Mit SIGINT hängt es davon ab, ob der Prozess das Signal behandelt. In diesem Fall wird wahrscheinlich über Exit (2) beendet, wodurch die Standard -E/A -Dateihandles spülen. Die Frage ist: War das Rohr mit der Standardausgabe oder über Popen () verbunden? Wenn ja, herausragende gepufferte Daten kann gespült sein; Wenn nicht, gibt es keine gepufferten Daten, sodass das Spülen unerheblich ist.

Wenn in der Pipe ungelesene Daten vorhanden sind, bleiben diese Daten in der Pipe und bereit, dass der Leser sammelt - unter der Annahme, dass es einen Leser gibt.

b. Was ist das Standardverhalten, wenn ein Prozess normal zurückkehrt? Ist es garantiert, das Rohr zu spülen und das Rohr zu schließen? (ohne dies natürlich ausdrücklich).

Es hängt davon ab, ob das Rohr über Standard -E/A angeschlossen wurde oder nicht. Wenn nicht, steht nichts an. Wenn ja, ja, ja, jedes Material in den Puffern wird gespült, da der Standard -E/A -Stream geschlossen ist.


c. Vielen Dank für die Informationen zu Signalen und den ungelesenen Daten, aber ich bin ein wenig verwirrt über die Standard -E/A -Rohrverbindung. Nachdem Sie Popen () erwähnt haben, habe ich nachgeschlagen und die Mannseite sagt, dass sein Rückgabewert mit einem E/A -Stream identisch ist und die Streams standardmäßig vollständig gepuffert sind. Ich bin mir einfach nicht klar, ob der Unterschied zwischen den beiden und nicht verstehe, woher der Unterschied kommt.

Der grundlegende Systemaufruf zum Erstellen von Rohren ist pipe(2). Es erstellt zwei Dateideskriptoren, eine für das Leseende der Pfeife, eines für das Schreibende. Wenn Sie nichts anderes mit ihnen anfangen, bleiben sie als Dateideskriptoren mit abgelaufenem Ausgang (über Schreib- (2) und verwandte Systemaufrufe). Wenn der Prozess endet, gibt es keine Pufferung in der Anwendung. Das Rohr ist geschlossen.

Wenn du benutzt popen(3), Dann funktioniert es viel mehr für Sie. Es ruft immer noch auf pipe(2) Um die Rohre zu erstellen, aber es macht dann a fork(2). Das Kind arrangiert die korrekte Konfiguration der Rohre und startet den Kinderprozess. Der Elternteil schließt auch das ungenutzte Ende des Rohrs und verwendet fdopen(3) So erstellen Sie einen Standard -E/A -Dateistrom für den aufrufenden Prozess.

Wenn der Dateistrom im E/A -Puffer Daten vorhanden ist, stellt ein Schließung oder ein Äquivalent sicher, dass die ausstehenden Daten gespült und der Dateideskriptor geschlossen wird.

Andere Tipps

Das normale Verhalten ist, dass alle Dateideskriptoren geschlossen werden, wenn ein Prozess endet. Dies bedeutet, dass ein Rohr wie jeder andere offene Dateideskriptor normal geschlossen wird.

Eine interessante Sache an Pipes: Wenn ein Prozess in POSIX in eine geschlossene Pfeife schreibt, erhält der Schriftsteller ein Signal Sigpipe.


Bearbeiten:

Eine Einschränkung: Der Unterschied zwischen S SIGX -Terminierung und einer normalen Beendigung besteht darin, dass Sie, wie bei jeder anderen Datei schreiben, Daten verlieren, die gepuffert wurden (über eine Datei schreiben) und noch nicht an den Dateideskriptor geschrieben wurden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top