Nach dem fork-Verfahren teilen der Eltern- und Kindprozess den durch pipe erstellten Dateideskriptor?

7
%Vor%

Nach meinem Verständnis teilt der von fork erstellte untergeordnete Prozess Variablen nicht mit seinem übergeordneten Prozess. Dann, warum hier der Elternteil in einen Dateideskriptor schreiben kann und der Kindprozess die Daten durch Lesen von einem anderen Dateideskriptor erhalten kann. Liegt das daran, dass sie irgendwie von der Pipe-Funktion intern gesteuert werden?

    
q0987 11.07.2011, 03:47
quelle

3 Antworten

15

Dateideskriptoren, einschließlich Pipes, werden auf fork dupliziert - der untergeordnete Prozess endet mit der gleichen Dateideskriptortabelle, einschließlich stdin / out / err und den Pipes, wie die Eltern unmittelbar vor der Verzweigung hatten.

  

Nach meinem Verständnis teilt der von fork erstellte untergeordnete Prozess Variablen nicht mit seinem übergeordneten Prozess.

Das ist nicht ganz richtig - Änderungen an Variablen werden nicht mit dem Elternteil geteilt, aber die Werte, die das Elternteil unmittelbar vor der Verzweigung hatte, sind danach für das Kind sichtbar.

In jedem Fall existieren Pipes innerhalb des Betriebssystems, nicht innerhalb des Prozesses. So werden Daten, die an ein Ende der Pipe geschrieben werden, für jeden anderen Prozess sichtbar, der eine FD für das andere Ende enthält. (Wenn mehr als ein Prozess versucht, die Daten zu lesen, wird der erste Prozess, der versucht, read() data zu lesen, und alle anderen Prozesse verpasst.)

    
duskwuff 11.07.2011, 03:54
quelle
5

Die Variablen werden z.B. Wenn Sie file_pipes[0] = 999 in das untergeordnete Element schreiben, wird es nicht im übergeordneten Element angezeigt. Die Dateideskriptoren werden gemeinsam verwendet (die FD-Nummer x im untergeordneten Element bezieht sich auf dasselbe wie die FD-Nummer x im übergeordneten Element). Aus diesem Grund können Sie (zum Beispiel) die Ausgabe eines Shell-Skripts umleiten, das andere Befehle ausführt (weil sie den gleichen Standard-Ausgabedateideskriptor verwenden).

    
lmz 11.07.2011 03:51
quelle
1

Sie haben Recht - gewöhnliche Variablen werden nicht zwischen Eltern und Kind geteilt.

Pipes sind jedoch keine Variablen. Sie sind eine Pseudodatei, die speziell dafür entwickelt wurde, zwei unabhängige Prozesse miteinander zu verbinden. Wenn Sie in eine Pipe schreiben, ändern Sie keine Variable im aktuellen Prozess - Sie senden Daten an das Betriebssystem und bitten sie, diese Daten dem nächsten Prozess zum Lesen aus der Pipe zur Verfügung zu stellen.

>

Es ist wie beim Schreiben in eine reale Datei auf der Festplatte - nur dass die Daten nicht auf die Festplatte geschrieben werden, sondern nur am anderen Ende der Pipe.

    
caf 11.07.2011 04:47
quelle