NewBe
Registrado: 06 Oct 2011 Mensajes: 13
| Publicado: 10/11/2011 7:08 am | | | Título: Procesos encadenados |
| 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.
| Cita: | /* 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 |
|
_Leo_
Registrado: 20 Oct 2005 Mensajes: 399 Ubicación: Buenos Aires, Argentina
| Publicado: 27/11/2011 6:31 am | | | Título: |
| Creo que te va a resultar mucho más fácil ejecutar el ps con la función popen() que te devuelve un filedescriptor del que podés leer la salida del comando ejecutado.
| Código: | FILE* f = popen("ps ...", "r");
|
Luego al leer f obtenés la salida estándar del proceso.
_________________ _Leo_ Daphne - administrador de tareas Cine, tecnología, sociedad |
|