Question
Après avoir intégré la réponse de Ben Voigt dans le code, il semble fonctionner
Question originale:
Je suis en train d'utiliser dup2 à:
- passer la sortie de "ls -al" en entrée "grep toto",
- dont la sortie devient entrée pour "grep bar",
- qui sort enfin à stdout.
La sortie finale est (en blanc), le fichier « dans » est (en blanc) et le fichier « out » a la sortie de « ls -al ».
Toutes les idées ce qui pourrait arriver?
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);
}
La solution
Votre appel open
crée un fichier vide « dans » et aucun des programmes écrire, de sorte que l'on attend. Étant donné que les deux instances de grep
lues à partir d'un fichier vide, leur sortie est vide aussi.
Qu'est-ce que vous voulez vraiment est d'utiliser la fonction pipe
pour obtenir une paire de poignées, ce qui est écrit pour être un programme et lus à partir de la prochaine. Vous aurez besoin d'appeler deux fois parce que vous avez deux séries de connexions entre les processus enfants.