Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Portada » Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 7 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Lun Oct 25, 2010 11:09 am
Mensajes: 6

Nota Publicado: Lun Oct 25, 2010 11:20 am 
Arriba  
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:
#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;
}

 Perfil  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 8:00 am
Mensajes: 1457
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Lun Oct 25, 2010 11:46 pm 
Arriba  
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" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Lun Oct 25, 2010 11:09 am
Mensajes: 6

Nota Publicado: Vie Nov 19, 2010 10:28 am 
Arriba  
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:
#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
      }
        }
   
}

 Perfil  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Mar Nov 30, 2010 11:27 pm
Mensajes: 2

Nota Publicado: Mié Dic 01, 2010 6:50 pm 
Arriba  
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

 Perfil  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 8:00 am
Mensajes: 1457
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Jue Dic 02, 2010 12:37 am 
Arriba  
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" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Mar Nov 30, 2010 11:27 pm
Mensajes: 2

Nota Publicado: Jue Dic 02, 2010 1:13 am 
Arriba  
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

 Perfil  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 8:00 am
Mensajes: 1457
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Jue Dic 02, 2010 1:46 am 
Arriba  
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" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  
Mostrar mensajes previos:  Ordenar por  
 [ 7 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


 Temas relacionados   Autor   Respuestas   Vistas   Último mensaje 
Creacion de procesos con fork

en Programación

chonico

5

1589

Mar Jun 26, 2012 4:04 pm

hipersayan_x Ver último mensaje

ejercicios sobre procesos padres e hijos

en Programación

albarito17

2

4281

Jue Mar 11, 2010 11:36 pm

albarito17 Ver último mensaje

crear procesos con fork

en Programación

skylark

5

1979

Jue Nov 11, 2010 1:51 am

akodo Ver último mensaje

Creación de procesos

en Programación

luis__cap

6

1053

Mar Ene 25, 2011 11:20 pm

akodo Ver último mensaje

Funcion FORK()

en Noticias y Actualidad

Samsaveel

0

509

Jue Feb 09, 2017 2:24 am

Samsaveel Ver último mensaje



¿Quién está conectado?

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

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC + 1 hora [ DST ]
Traducción al español por Huan Manwë
phpBB SEO