[C con Clase] Dudas con procesos, system(), fork()...
Pogui
poguijuaz en gmail.com
Vie Jul 18 15:09:31 CEST 2008
Stereo System escribió:
> Hola a todos...
>
> He buscando informacion al respecto y la funcion system(), engloba a execl, fork, y wait...
> por tanto si quiero ejecutar otro programa como proceso hijo utilizo la funcion system() ?? , me podrian aclarar esto..
>
> En mi funcion nesecito ejecutar otro programa, osea otro proceso y que ambos procesos Padre e Hijo se ejecuten simultaneamente... y solo si el proceso Padre termina de ejecutarse el Hijo se detenga..
>
> Os pregunto por que no he encontrado informacion acerca del tema en google, sobre los dos procesos simultaneos....
>
Hola, la fc. sistem se usa para hacer llamadas al sistema, (ejecutar un
comando).
Para manejar Procesos, te dejo un ejemplo para que lo mires:
#include <stdio.h>
#include <unistd.h>
int main (void){
printf ("antes del fork \n");
switch(fork()) {
case 0: /* hijo */
printf("soy el hijo\n");
break;
case -1: /* error*/
perror("fork()");
return 1;
default: /* padre */
sleep(2);
break;
}
printf("pid=%d \n",getpid());
return(0);
}
Los procesos hijos y padres (como te vas a dar cuenta cuando compiles
este ejemplo) se ejecutan simultáneamente.
Para esperar la finalización del proceso de un hijo, en el padre podes
usar la llamada a sistema wait(); que hace específicamente eso.
Para comunicación entre procesos usas pipes, te dejo otro ejemplito muy
bueno :D :
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main (int argc, char *argv[])
{
int pfd[2];
pid_t cpid;
char buf;
if (pipe (pfd) == -1)
{
perror ("pipe");
exit (EXIT_FAILURE);
}
cpid = fork ();
if (cpid == -1)
{
perror ("fork");
exit (EXIT_FAILURE);
}
if (cpid == 0)
{ /* el hijo lee el pipe */
close (pfd[1]); /* cerramos el fd de escritura */
while (read (pfd[0], &buf, 1) > 0)
write (STDOUT_FILENO, &buf, 1);
write (STDOUT_FILENO, "\n", 1);
close (pfd[0]);
exit (EXIT_SUCCESS);
}
else
{ /* el padre escribe argv[1] en el pipe */
close (pfd[0]); /* cerramos el fd de lectura */
write (pfd[1], argv[1], strlen (argv[1]));
close (pfd[1]); /* cerramos el fd de escritura, el lector verá EOF */
wait (NULL); /* esperamos al hijo y terminamos */
exit (EXIT_SUCCESS);
}
}
Espero que esto te de una ayudita con tus problemas :)
salu2
Más información sobre la lista de distribución Cconclase