Pregunta

Estoy intentando crear una concha simple en C para Unix. He sido capaz de hacer todo el análisis de los comandos y la ejecución, pero estoy teniendo un problema con la tubería. Creo que el problema es que no estoy enganchando en el tubo correcto para la entrada de la segunda orden.

Por ejemplo, si escribo "ls | wc", hará una pausa después del comando "WC", que creo que es debido a que su espera para la entrada. Creo que el problema es cuando uso dup2 (lectura [i], 0), y no es enganchar en la tubería correcta.

Sé que esto es un poco de una pregunta amplia, pero si hay punteros que pude conseguir, yo lo aprecio. Aquí está el código que crea nuevos procesos y trata de tubería de ellos.

    int fileds[2];
    int reading[num_cmds];
    int writing[num_cmds];

    int p;
    for(p=0; p < num_cmds; p++)
    {
        reading[p] = -1;
        writing[p] = -1;
    }

    int j;
    for(j=0; j < num_cmds-1; j++)    //Create pipes for commands
    {
        int fileds[2];
        pipe(fileds);
        reading[j+1] = fileds[0];
        writing[j] = fileds[1];
    }

    int i = 0;
    for(i = 0; i < num_cmds;i++)
    {           
        cmd_args = parse_cmd(cmds[i],output_file,input_file,&run_bg); //Get command and args

        pid_t childpid;
        int status;
        childpid=fork();

        if (childpid >= 0) 
        {
            if (childpid == 0) 
            {               
                if(writing[i] != -1)
                {
                    dup2(writing[i],1);
                    close(writing[i]);
                }

                if(reading[i] != -1)
                {
                    dup2(reading[i],0);
                    close(reading[i]);
                }

                int h;
                for(h = 0; h < num_cmds; h++)
                {
                    close(writing[h]);
                    close(reading[h]);
                }

                if(execvp(cmd_args[0],cmd_args) == -1) 
                {
                    perror("Problem with command");
                    exit(0);
                }
            }
            else 
            {
                wait(&status);
                int m;
                for(m = 0; m < num_cmds; m++)
                {
                    if( writing[m] != -1) close(writing[m]);
                    if( reading[m] != -1) close(reading[m]);
                }
            }
        }
        else 
        {
             perror("fork"); 
             continue;
        }


        input_file[0] = 0;
        output_file[0] = 0;
        run_bg = 0;
    }

}


ACTUALIZACIÓN: yo era capaz de entenderlo, gracias a Richard. Fue una combinación de cerrar los descriptores de archivo en el orden equivocado y no el cierre de algunas en absoluto. Aquí está el código de trabajo.

int fileds[2];
    int reading[num_cmds];
    int writing[num_cmds];

    int p;
    for(p=0; p < num_cmds; p++)
    {
        reading[p] = -1;
        writing[p] = -1;
    }

    int j;
    for(j=0; j < num_cmds-1; j++)
    {
        int fileds[2];
        pipe(fileds);
        reading[j+1] = fileds[0];
        writing[j] = fileds[1];
    }

    int i = 0;
    for(i = 0; i < num_cmds;i++)
    {           
        cmd_args = parse_cmd(cmds[i],output_file,input_file,&run_bg);

        pid_t childpid;
        int status;
        childpid=fork();

        if (childpid >= 0) 
        {
            if (childpid == 0) 
            {               
                if(writing[i] != -1)
                {
                    close(1);
                    dup2(writing[i],1);
                }

                if(reading[i] != -1)
                {
                    close(0);
                    dup2(reading[i],0);
                }

                if(execvp(cmd_args[0],cmd_args) == -1) 
                {
                    perror("Problem with command");
                    exit(0);
                }
            }
            else 
            {

                wait(&status);
                close(writing[i]);

                if(i > 0) 
                {
                    close(reading[i]);
                }
            }
        }
        else 
        {
             perror("fork");
        }


        input_file[0] = 0;
        output_file[0] = 0;
        run_bg = 0;
    }
¿Fue útil?

Solución

Creo que su problema puede ser que espere para cada proceso dentro del bucle y luego cerrar todos los descriptores de fichero. Esto hace que los descriptores de archivos no válidos para la siguiente llamada a dup2 () y los resultados en la entrada estándar para el siguiente proceso permanecer sin cambios.

Sólo una conjetura, no he ejecutar el código.

Otros consejos

Cuando escribo "ls | wc" wc hace como se esperaba e imprime el número de palabras de salida por el comando ls. Recuerde que cuando se está utilizando comandos de tubería "|" no es necesario para crear tuberías de su aplicación. Las primeras necesidades órdenes en la salida a la salida estándar y el segundo necesidades comando para leer que la producción de la norma en.

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