• Lunes 16 de Diciembre de 2024, 00:53

Autor Tema:  C: Error en ejecución  (Leído 875 veces)

zany_666

  • Miembro activo
  • **
  • Mensajes: 29
  • Nacionalidad: es
    • Ver Perfil
C: Error en ejecución
« en: Sábado 1 de Mayo de 2010, 20:47 »
0
Hola, quería pediros ayuda para un programa que me he hecho en C. Lo que quiero hacer en mi programa es un pipeline (había puesto algún post con dudillas al respecto que ya fueron resueltas) La ejecución de mi programa, por ejemplo, ./pipeline ls wc tiene que ser igual a la ejecución en la shell de $ ls | wc. De momento he probado con solo dos instrucciones, aunque posteriormente lo haré con más de 2. Creo un hijo para la ejecución de cada instrucción y los comunico mediante pipes, mi problema es que el primer hijo no ejecuta correctamente con execlp, y no comprendo porqué, como consecuencia el segundo hijo no ejecuta nada (no recibe nada por el pipe) y el padre se queda esperando a que termine éste. Os pongo lo que me muestra la shell y el código haber si me podeis echar una mano y veis algún fallo.

SHELL:
SOY EL PRIMER HIJO
Voy a ejecutar: ls
SOY EL PADRE
: Ejecución incorrecta 1
SOY EL ULTIMO HIJO
Voy a ejecutar: wc
SOY EL PADRE
Aquí se queda esperando el padre

Código: C
  1.  
  2. #define READ 0
  3. #define WRITE 1
  4.  
  5. int main(int argc, char *args[]) {
  6.  
  7.    int i,j,k;
  8.    int pid;
  9.    int valor;
  10.    int child_pid;
  11.    int status;
  12.    int **arrayPipe;
  13.  
  14.  
  15.     if (argc == 2) {
  16.         execlp(args[1],args[1],NULL);   
  17.     } else {
  18.         //Crear pipes
  19.         arrayPipe = (int **) malloc((argc-2) * sizeof(int *));
  20.         for(i=0;i<argc-2;i++){
  21.             arrayPipe[i] = (int *) malloc(2 * sizeof(int));
  22.             valor=pipe(arrayPipe[i]);
  23.             if (valor==-1){
  24.                 perror("Error al crear el pipen");
  25.                     return -1;
  26.             }
  27.         }
  28.         //Crear procesos
  29.         for (i=0;i<argc-1;i++){
  30.             pid = fork();
  31.             if (pid == -1){
  32.                     perror("Error al crear el hijon");
  33.                     return -1;
  34.             } else if (pid == 0){ /* Child */
  35.                
  36.                 if(i==0){   //Si es el primer hijo
  37.                     printf("SOY EL PRIMER HIJOn");
  38.                     //Cierro todos los descriptes excepto los suyos
  39.                     for (k=0;k<argc-2;k++){
  40.                         if (k!=i){
  41.                             close(arrayPipe[k][READ]);
  42.                             close(arrayPipe[k][WRITE]);                        
  43.                         }
  44.                     }
  45.                     printf("Voy a ejecutar: %sn",args[i+1]);
  46.                     close(arrayPipe[k][READ]);          //ESTA Y LAS DOS SIGUIENTES ESTÁN MAL, EL INDICE ES i Y NO k
  47.                     dup2(arrayPipe[k][WRITE],1);
  48.                     close(arrayPipe[k][WRITE]);                
  49.                     execlp(args[i+1],args[i+1],NULL);    //Esta es la instrucción que me falla
  50.                     exit(EXIT_FAILURE);
  51.                 } else if (i==argc-2){  //Si es el último
  52.                     printf("SOY EL ULTIMO HIJOn");
  53.                     //Cierro todos los descriptes excepto los suyos
  54.                     for (k=0;k<argc-2;k++){
  55.                         if (k!=i-1){
  56.                             close(arrayPipe[k][READ]);
  57.                             close(arrayPipe[k][WRITE]);                        
  58.                         }
  59.                     }
  60.                     //printf("Voy a ejecutar: %sn",args[i+1]);
  61.                     close(arrayPipe[i-1][WRITE]);
  62.                     dup2(arrayPipe[i-1][READ],0);
  63.                     close(arrayPipe[i-1][READ]);
  64.                     printf("Voy a ejecutar: %sn",args[i+1]);
  65.                     execlp(args[i+1],args[i+1],NULL);
  66.                     exit(EXIT_FAILURE);
  67.                 } else {        //Si es intermedio
  68.                                         //Aquí iria el código en el caso de ser más de dos hijos
  69.                 }
  70.  
  71.             } else {/* Parent */
  72.                 //Cierro descriptores en el padre
  73.                 printf("SOY EL PADREn");
  74.                 if (i==0){
  75.                     for (j=0;j<argc-2;j++){
  76.                         close(arrayPipe[j][READ]);
  77.                         close(arrayPipe[j][WRITE]);
  78.                     }
  79.                 }
  80.                 child_pid = wait(&status);
  81.                 if (WIFEXITED(status) == 0){
  82.                                         printf(": Ejecución incorrecta 1n");
  83.                                 } else {
  84.                                         if (WEXITSTATUS(status)){
  85.                                                 printf(": Ejecución incorrecta 2n");
  86.                                         } else {
  87.                                                 printf(": Ejecución correctan");
  88.                                         }
  89.                                 }
  90.             }
  91.  
  92.         }
  93.        
  94.         //Liberar memoria
  95.         for(i=0;i<argc-2;i++){         
  96.             free(arrayPipe[i]);
  97.         }
  98.         free(arrayPipe);
  99.     }
  100. return 0;
  101. }
  102.  
EDIT:Un error tonto, lo he puesto en el código.
Una imágen vale más que mil palabras, pero ocupa mucha más memoria...