Ich habe einen verdächtigen Punkt aus dem unten geschriebenen Code.Pipe & dup Funktionen in UNIX
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(void){
int pid;
int i,j;
char c;
int pfd[2];
if(pipe(pfd) == -1){
perror("pipe");
exit(1);
}
// pfd[0] : process read from pfd[0]
// pfd[1] : process write to pfd[1]
pid = fork();
if(pid == -1){
perror("pid error\n");
exit(1);
}
else if(pid == 0){
close(pfd[0]);
close(1);
dup(pfd[1]);
close(pfd[1]);
execlp("./lcmd", "lcmd", NULL);
exit(0);
}
else if(pid > 0){
wait(NULL);
close(pfd[1]);
close(0);
dup(pfd[0]);
close(pfd[0]);
execlp("./rcmd", "rcmd", NULL);
printf("\n");
}
return 0;
}
Dieser Code erläutert den Umgang mit der Dup-Funktion.
Wie Sie sehen können, wenn pid gleich 0 ist (was bedeutet, Kind-Prozess ist im Gange), schließen Sie Teil der Pipe lesen und auch stdout Datei-Deskriptor zu schließen. (schließen (pdf [0]), schließen (1)).
Ich kann verstehen, stdout fd sollte in der Nähe sein, weil Teil der Rohrleitung schreiben (pdf [1]) sollte in früheren stdout Ort sein. (Dup (pdf) [1])
Allerdings kann ich nicht bekommen, dass , warum ein Teil des Rohres lesen (in der Nähe (pdf [0]) und Schreib Teil des Rohres geschlossen werden soll (in der Nähe (pfd [ 1]))
obwohl Rohr bidirektional ist, ich denke, es ist nicht notwendig, Zustand anderen Teil des Rohres zu schließen, die nicht verwendet wird
Insbesondere schließen (pdf) [1] <.. - Dieser Teil, wenn es keinen Ausgabestrom gibt (weil stdout und pdf [1] (schreiben Teil der Pipe) geschlossen wurde vor Ausführen der execlp-Funktion), wo ging die Ausgabe von execlp Funktion?
Ich verstehe, warum ein Teil der Leitung geschlossen sein sollte. Vielen Dank. Allerdings ist es für mich immer noch nicht klar, beide Seiten des Rohrs nach der Verwendung von "dup" zu schließen. hmm .. –
Welchen Teil verstehst du? Nach der Gabel gibt es 4 Enden an der Rohrleitung, jeweils 2 an Eltern und Kind. Verwenden von P0 für das Eltern-Leseende, P1 für das Eltern-Schreibende, C0 für das Kind-Leseende und C1 für das Kind-Schreibende, welche Deskriptoren sind OK mit Schließen, und mit welchen Problemen hast du? Beachten Sie, dass es manchmal nicht wichtig ist, wenn Sie unvorsichtig sind - aber Ihr Programm kann sich verklemmen, wenn es darauf ankommt. Dies ist insbesondere bei nichtlinearen Pipelines oder bei mehrstufigen Pipelines der Fall. –