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 à:

  1. passer la sortie de "ls -al" en entrée "grep toto",
  2. dont la sortie devient entrée pour "grep bar",
  3. 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);
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top