[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