Domanda
Dopo aver incorporato la risposta di Ben Voigt nel codice, sembra funzionare
domanda iniziale:
Sto cercando di utilizzare dup2 a:
- passare l'output di "ls -al" come input per "foo grep",
- la cui uscita diventa input per "grep bar",
- che infine emette stdout.
Il risultato finale è (in bianco), il file "in" è (in bianco) e il file "out" ha l'output di "ls -al".
Tutte le idee che potrebbe accadere?
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);
}
Soluzione
La chiamata open
crea un file vuoto "in" e nessuno dei programmi di scrivere ad essa, in modo che ci si aspetta. Dal momento che entrambe le istanze di grep
letti da un file vuoto, la loro produzione è anche vuoto.
Che cosa si vuole veramente è quello di utilizzare la funzione pipe
per ottenere un paio di maniglie, che è scritto per essere un programma e letti dal dal successivo. Avrete bisogno di chiamarla due volte perché si hanno due set di connessioni tra i processi figli.