Pregunta

Después de la incorporación de la respuesta de Ben Voigt en el código, parece que el trabajo

pregunta original:

Estoy intentando utilizar dup2 a:

  1. pasar la salida de "ls -al" como entrada a "foo grep",
  2. cuya salida se convierte en la entrada de "grep bar",
  3. que finalmente da salida a la salida estándar.

El resultado final es (en blanco), el archivo "en" es (en blanco) y el archivo de "fuera" tiene la salida de "ls -al".

Cualquier idea lo que podría estar sucediendo?

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);
}
¿Fue útil?

Solución

Su llamada open crea un archivo vacío "en" y ninguno de los programas de escribir en él, por lo que se espera. Dado que las dos instancias de grep leídos desde un archivo vacío, su producción también está vacía.

Lo que realmente quiere es utilizar la función pipe para conseguir un par de manijas, que está escrito para ser un programa y se leen por el siguiente. Tendrá que llamar dos veces porque tiene dos conjuntos de conexiones entre los procesos secundarios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top