Procesos encadenados

Iniciado por NewBe, 10 Noviembre 2011, 16:06 PM

0 Miembros y 1 Visitante están viendo este tema.

NewBe

Hola,

Tengo una consulta sobre los procesos. La siguiente función debería de capturar el resultado de un " ls | grep " y mostrarlo en un string, pero se ve por pantalla
directamente.

Aunque soy novato en esto, veo que algo me falta, pero he hecho tantas pruebas
que ya no se que puede ser.



Citar/* Implements numfiles request */
int do_numfiles (char *pattern)
{
   int  st1, st2;
   int p[2];
   t_string s, num0, num1;
   int ret = 0;
   t_string x;
    
     /* mensaje de echo en green */   
     sprintf (s, "%s[%d] numfiles %s %s\n", color_green, getpid (),  pattern,color_end);
    
  if (write (1, s, strlen (s)) == -1)
    return -1;

  delay ();
 
  /* cadenada con los parametros y el patterns
  sprintf(t, "grep -c %s \n", pattern);*/
 
   /* Se crea la pipe:*/
   if (pipe(p) < 0) error("Creación de la  pipe");

   switch (fork())
   {

      case -1: error("Fork 1");

      case 0: /* Hijo  1 –  */
      /* Redirecciona la salida hacia la pipe */

      close(1); dup(p[1]);

      /* Se cierran canales */

      close(p[0]); close(p[1]);
      
                                /* Se ejecuta el código*/

      execlp("ls", "ls", NULL);
      error("Ejecución ls");

      default:
      break;
   }

   switch (fork())
   {

      case -1: error("Fork 2");
      case 0: /* Hijo 2 */
      /* Redirecciona entrada estàndard a la pipe */

      close(0); dup(p[0]);

      /* Cierra canales */
         
      close(p[1]);close(p[0]);
               
      /* Ejecuta grep  */
         
                  execlp("grep", "grep","-c", pattern,  (char *)0);
      error("Ejecución grep");
   
      default:
      break;
   }
      
      
      read(p[1], num0, strlen(num0));
      read(p[0], num1, strlen(num1));

   /* Se cierran canales*/
      
                             close(p[0]); close(p[1]);


   /*cadena con el resultado */
   sprintf (s, "%s[%d] return code canal 0: %s  canal 1: %s \n%s",   
                color_green, getpid (), num0, num1, color_end);
   
   write(1, s, strlen(s));

   /* Espera a los hijos */

   wait(&st1);
   wait(&st2);
         

  /* Must return the number of exit */
  exit(0);

}

Saludos y gracias

D4RIO

¿Un novato en qué área? indagas en pipes y control de procesos, usando llamadas al sistema.

Yo me preguntaría si es necesario todo ese "dirty code", existiendo una forma limpia como popen (http://www.manpagez.com/man/3/popen/) para hacer exactamente lo mismo.

A demás, considera usar la etiqueta de código correcta para que veamos el resaltado de sintáxis, así es más fácil leer.

Saludos
OpenBSDFreeBSD