Nach der Gabel, machen die parent-und child-Prozess die Freigabe der Datei-Deskriptor erstellt von Rohr?
int main()
{
int data_processed;
int file_pipes[2];
const char some_data[] = "123";
char buffer[BUFSIZ + 1];
pid_t fork_result;
memset(buffer, '\0', sizeof(buffer));
if (pipe(file_pipes) == 0) {
fork_result = fork();
if (fork_result == -1) {
fprintf(stderr, "Fork failure");
exit(EXIT_FAILURE);
}
//We've made sure the fork worked, so if fork_result equals zero, we're in the child process.
if (fork_result == 0) {
data_processed = read(file_pipes[0], buffer, BUFSIZ);
printf("Read %d bytes: %s\n", data_processed, buffer);
exit(EXIT_SUCCESS);
}
//Otherwise, we must be the parent process.
else {
data_processed = write(file_pipes[1], some_data,
strlen(some_data));
printf("Wrote %d bytes\n", data_processed);
}
}
exit(EXIT_SUCCESS);
}
Basiert auf meinem Verständnis, wird der Kind-Prozess erstellt durch die Gabel nicht teilen, Variablen mit übergeordneten Prozess. Dann, warum hier die Eltern das schreiben eines file-descriptor-und Kind-Prozess können die Daten durch das Lesen aus einer anderen Datei-Deskriptor. Ist das, weil Sie irgendwie kontrolliert durch die pipe-Funktion intern?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Datei-Deskriptoren, einschließlich der Rohre, werden dupliziert auf
fork
-- der Kind-Prozess endet mit dem gleichen Datei-Deskriptor-Tabelle, einschließlich stdin/out/err und die Rohre, als Eltern hatten unmittelbar vor der Gabel.Dies ist nicht ganz wahr -- änderungen Variablen sind nicht gemeinsam mit dem Elternteil, aber die Werte, die Eltern hatten sich unmittelbar vor der Gabel sind alle sichtbar, um das Kind danach.
In jedem Fall, die Rohre sind innerhalb des Betriebssystems, die nicht in den Prozess. Als solche, die Daten geschrieben, um ein Ende der Leitung wird sichtbar in jedem anderen Prozess hält ein FD für das andere Ende. (Wenn mehr als ein Prozeß versucht, die Daten zu Lesen, wird der erste Prozess, um zu versuchen, um
read()
Daten, die es bekommt, und alle anderen Prozesse zu verpassen.)Die Variablen nicht freigegeben werden, wenn Sie z.B. schreiben
file_pipes[0] = 999
des Kindes, wird es nicht widergespiegelt werden, in der übergeordneten. Die file-Deskriptoren gemeinsam sind (FD-Nummerx
im Kindes bezieht sich auf die gleiche Sache wie FD-Nummerx
bei den Eltern). Dies ist der Grund, warum (zum Beispiel) Sie können die Umleitung der Ausgabe eines shell-script führt andere Befehle (denn Sie teilen sich die gleiche standard-Ausgabe-file-Deskriptor).Du hast Recht - normale Variablen nicht geteilt zwischen dem Elternteil und dem Kind.
Allerdings sind die Rohre nicht Variablen. Sie sind ein pseudo-Datei speziell für den Anschluss von zwei unabhängigen Prozessen zusammen. Beim schreiben in eine pipe, du bist nicht die änderung einer variable in der die aktuelle Prozess - Sie sind das senden von Daten aus dem Betriebssystem und bittet, es zu machen, dass die Daten zur Verfügung, um den nächsten Prozess zu Lesen aus der pipe.
Ist es genau so wie beim schreiben auf eine echte, Datei auf der Festplatte - außer, dass die Daten nicht auf die Festplatte geschrieben, es ist nur am anderen Ende der Leitung.