Creacion de procesos hijos con fork

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
chonico
Forista Nuevo
Forista Nuevo
Mensajes: 6
Registrado: Lun Oct 25, 2010 11:09 am

Creacion de procesos hijos con fork

Mensaje por chonico » Lun Oct 25, 2010 11:20 am

Hola buenos dias a todos,
tengo una duda en un programa en C en el que consiste crear 5 procesos, de modo que cada uno es hijo dle anterior.En cada proceso lleva asociado un numero entero (0 para el principal y 5 para el ultimo creado). Al ser creado cada uno muestra el numero asociado, su PID y el de su padre. Y ya para terminar los procesos mueren en orden inverso a como fueron creados escribiendo su numero y su PID...

Mi duda es que si voy bien encaminado o no..
de momento solo llevo esto programado

Código: Seleccionar todo

#include <unistd.h>
#include <stdio.h>
int main()
{
int contador;
        for(contador=0;contador<5;contador++)
        {
                if(fork()==0)
                {
                        printf("PID del HIJO %i proceso = %i Pid padre = %i\n", getpid(),contador,getppid());
                }
        }
	return 0;
}
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Creacion de procesos hijos con fork

Mensaje por akodo » Lun Oct 25, 2010 11:46 pm

Creo que es mejor que a la hora de hacer el fork guardes su resultado, porque el resultado es 0 si es el proceso padre, y el identificador del padre si es el hijo (o algo así, revísalo de todos modos porque no me acuerdo bien).

Al margen de esto deberías meter un break en algún sitio. Tal como tu lo tienes sucede algo como lo que te explico:
· Se realiza el primer fork duplicando el proceso. Se obtiene un padre y un hijo.
· El hijo (o el padre, que siempre me confundo) se mete por el "if" imprimiendo el mensaje.
· Tanto el padre como el hijo acaban el bucle y realizan otra iteración porque no se han acabado.
· Al haber dos procesos, tanto el padre como el hijo realizan un fork dando lugar a otro par de procesos (un fork del padre y otro del hijo)
Supongo que esto último no es lo que quieres...
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
chonico
Forista Nuevo
Forista Nuevo
Mensajes: 6
Registrado: Lun Oct 25, 2010 11:09 am

Re: Creacion de procesos hijos con fork

Mensaje por chonico » Vie Nov 19, 2010 10:28 am

al final consegui, por lo menos a mi me sirvio a lo que yo buscaba no se si estara bien o no pero lo comparto con vosotros por si algun dia os hace falta

Código: Seleccionar todo

#include <unistd.h>
#include <stdio.h>
void main()
{
int contador; //creamos un contador para controlar los hilos
		   //que queremos crear
        for(contador=0;contador<5;contador++)
		//con este bucle crearemos 5 hilos y el padre.
        {
                if(fork()==0)//Creamos el hilo
                {
                        printf("PID del HIJO %i proceso = %i Pid padre = %i\n", getpid(),contador,getppid());
//imprimimos en pantalla el pid del hijo el numero de proceso
// y el pid del padre.
                }else //Si lo que devuelve el fork
				//es distinto de cero
		{
			wait(2);//esperamos a que termine el hijo
			printf("PID del HIJO %i proceso = %i Pid padre = %i\n", getpid(),contador,getppid());
//imprimimos en pantalla el pid del hijo el numero de proceso
// y el pid del padre.
			exit(0);  //eliminamos el hilo
		}
        }
    
}
jonhyrodri
Forista Nuevo
Forista Nuevo
Mensajes: 2
Registrado: Mar Nov 30, 2010 11:27 pm

Re: Creacion de procesos hijos con fork

Mensaje por jonhyrodri » Mié Dic 01, 2010 6:50 pm

Hola buenas tardes,
Soy nuevo en el foro, he consultado muchas veces cuando he tenido dudas, pero ahora llevo bastante tiempo con el problema siguiente. Tengo un programa en C que simula un juego de cartas, este crea unos procesos dependiento del número de jugadores que le pasemos como parametro, hasta aquí bien. Lo que necesito es que el resultado del mismo sea que dependiendo del número de jugadores introducidos por parametros me cre todos los hijos y me muestre por pantalla los pid antes que salte el wait() para que se ejecuten los procesos del hijo.
El programam inicial es el siguiente:
int main(int arc, char *arv[])
{
int i, n, st, pid;
char s[100];
char *args[] = {"jugador1", "jugador1", NULL};

if (arc != 2) error("Error: wrong arguments.");

n = atoi(arv[1]);
if (n > MAX_PLAYERS) error("Error: too many players.");

sprintf(s, "\n**********Start of game (%d players, pid croupier=%d)***********\n", n, getpid());
if (write(1, s, strlen(s)) < 0) error("write");

for (i = 0; i < n; i++) {
switch (pid = fork()) {
case -1: error("fork");

case 0:
execv(args[0], args);
error("exec");

default:
sprintf(s, "%s[%d] pid=%d created%s\n", color_blue, getpid(), pid, color_end);
if (write(1, s, strlen(s)) < 0) error("write");

pid = wait(&st);
if (pid == -1) error("wait");

sprintf(s, "%s[%d] pid=%d ended%s\n", color_blue, getpid(), pid, color_end);
if (write(1, s, strlen(s)) < 0) error("write");
}
}

sprintf(s, "\n**********End of game: all players have ended***********\n");
if (write(1, s, strlen(s)) < 0) error("write");

exit(0);
}


Esto funciona, pero la idea ahora es que el created salga tantas veces como jugadores se introduzcan, pero de forma inicial, despues el execv y al finalizar los ended.

no se si me podreis dar alguna pista.

Gracias de antemano
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Creacion de procesos hijos con fork

Mensaje por akodo » Jue Dic 02, 2010 12:37 am

Creo que en la librería "wait.h" hay un wait que permite esperar hasta que acabe el proceso con el pid que se le pasa como parámetro. Estoy casi seguro de que ese wait existe, pero no sé si es esa la biblioteca.

Sabiendo el pid del hijo (es el valor que se le devuelve al padre) puedes hacer que este se espere, entonces el hijo mostraría los mensajes, acabaría y se ejecutaría el padre con el execv. El problema estaría con los ended. Podrías intentar realizar algún tipo de comunicación basada en archivos (si ha escrito el archivo "fin1" es que el proceso ha acabado) y de esa forma saber cuando se puede escribir el mensaje final.

De todas formas deberías plantearte cambiar de alguna forma los execv porque no vas a tener ningún control sobre ellos. Si es posible, mejor con hilos. Creo que los procesos son más para "viajes sin retorno", simplemente dejas que se ejecuten sin preocuparte de nada más.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
jonhyrodri
Forista Nuevo
Forista Nuevo
Mensajes: 2
Registrado: Mar Nov 30, 2010 11:27 pm

Re: Creacion de procesos hijos con fork

Mensaje por jonhyrodri » Jue Dic 02, 2010 1:13 am

Gracias por la respuesta akodo.

No he puesto todo el código, antes del primer main se hace la delcaración del args, para que el execv llame a un programa que también existe.
El código que he mostrado podríamos decir que es el de un "croupier" y el otro al cual va a llamar es "jugador1".
El programa funciona perfectamente, pero tengo que modificar la forma de la salida.
El programa inicialmente muestra en la salida primero el pid created, luego el juego (llamada a jugador1), y finalmente pid ended. Lo que se pide ahora es que de forma inicial se muestren todos los jugadores o pid involucrados de la forma
pid xx created
pid xx created
...
ejecución de execv (tantas veces como pids)
pid ended...

Es aqui donde viene el problema, seguro que esta en el wait que hay en el dafault pero no se muy bien que modificación hay que realizar
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Creacion de procesos hijos con fork

Mensaje por akodo » Jue Dic 02, 2010 1:46 am

Creo que necesitas "waitpid" en vez de "wait"
http://man.cx/waitpid%282%29/es

De todas formas, creo que supones que el execv no cambia el pid del proceso. Creo que es así, pero no estoy seguro. Aún asi, tienes la posibilidad de que se ejecute primero el execv antes de mostrar el mensaje, y no sé si eso resulta aceptable o no.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje