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);
}
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