Procesos encadenados

Dudas sobre los distintos compiladores C/C++ en Linux
Responder
Mensaje
Autor
NewBe
Mensajes: 13
Registrado: 06/10/2011 5:40 am

Procesos encadenados

#1 Mensaje por NewBe » 10/11/2011 7:08 am

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.
/* 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

Avatar de Usuario
_Leo_
Mensajes: 399
Registrado: 20/10/2005 11:00 pm
Ubicación: Buenos Aires, Argentina
Contactar:

#2 Mensaje por _Leo_ » 27/11/2011 6:31 am

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: Seleccionar todo

FILE* f = popen("ps ...", "r");
Luego al leer f obtenés la salida estándar del proceso.

http://linux.die.net/man/3/popen

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado