Frage
Nach dem Einbau Ben Voigt Antwort in den Code, es scheint zu funktionieren
Original Frage:
Ich versuche zu verwenden dup2 zu:
- passieren die Ausgabe von "ls -al" als Eingabe für "grep foo",
- , dessen Ausgang wird Eingang für "grep bar",
- , die schließlich auf die Standardausgabe ausgibt.
Der endgültige Ausgang ist (leer), wird die Datei „in“ ist (leer) und die Datei „out“ hat die Ausgabe von „ls -al“.
Alle Ideen, was könnte passieren?
int main()
{
pid_t pid;
int i;
int inFileDes,outFileDes;
inFileDes=open("in",O_RDWR | O_CREAT,S_IRUSR | S_IWUSR);
outFileDes=open("out",O_RDWR | O_CREAT,S_IRUSR | S_IWUSR);
for(i=0;i<3;i++)
{
if((pid=fork())==0)
{
switch(i)
{
case 0:
dup2(outFileDes,1);
execl("/bin/ls","ls","-al",0);
break;
case 1:
// originally:
dup2(outFileDes,0); // dup2(outFileDes,1);
dup2(inFileDes,1); // dup2(inFileDes,0);
execl("/bin/grep","grep","foo",0); //lines having foo
break;
case 2:
dup2(inFileDes,0);
execl("/bin/grep","grep","bar",0); //lines having foo & bar
break;
}
exit(-1); //in error
}
waitpid(pid,NULL,0);
}
close(inFileDes);
close(outFileDes);
return(0);
}
Lösung
Ihr open
Aufruf erzeugt eine leere Datei „in“ und keines der Programme schreiben, um es, so dass erwartet wird. Da beide Instanzen von grep
aus einer leeren Datei zu lesen, ist ihre Leistung auch leer.
Was Sie wirklich wollen, ist die pipe
Funktion zu verwenden, um ein Paar zu bekommen Griffe, die ein Programm geschrieben werden und von den nächsten lesen. Sie müssen es zweimal nennen, weil Sie zwei Sätze von Verbindungen zwischen Child-Prozesse haben.