Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 16BITBoy en 17 Junio 2010, 22:31 pm



Título: [Solucionado]Crear dos procesos duplicados a partir del padre usando fork() ?
Publicado por: 16BITBoy en 17 Junio 2010, 22:31 pm
Buenas.

Pues ando trasteando con los procesos en C con linux, y jugando con el fork.
Vereis, intento crear de un proceso padre, dos procesos iguales a este, diciéndome el padre los pid de esos dos procesos, de modo que esperaría algo como:
Código:
$ ./programa
Proceso padre trabajando
Los pid de los procesos son:
1111, 1112 //Por poner
Proceso hijo trabajando
Proceso hijo trabajando
$
En mi código dos funciones que hacen lo mismo casi, excepto que uno crea dos procesos en vez de crear uno, por motivos de pruebas. El código es el siguiente:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>

#define MAX_HIJOS 2

void uno()
{
pid_t hijo;
int i;
hijo = fork();

if(hijo != 0)
printf("Proceso padre trabajando\n\n");
else
{
printf("Proceso hijo trabajando\n");
}
}

void mostrar_pids(int *pids)
{
int i;
printf("Los pid de los procesos son:\n");
for(i = 0; i<MAX_HIJOS; i++)
{
printf("%d, ", pids[i]);
}

}

void varios()
{
pid_t hijos[MAX_HIJOS];
int i;
for(i=0; i<MAX_HIJOS; i++)
{
hijos[i] = fork();
if(hijos[i] == 0)
break; /*No llamamos mas a fork si sabemos es hijo*/
}
if(hijos[0] != 0)/*Aqui un proceso hijo entra... y no deberia..*/
{
printf("\nProceso padre trabajando\n\n");
mostrar_pids(hijos);
}
else
{
printf("\nProceso hijo trabajando\n");
}
}

int main()
{
varios();
exit(0);
}
Lo de "*Aquí un proceso hijo entra... y no deberia..*/" es algo que apunté por que pensé eso, no lo se en verdad. Bueno el problema es que lo que obtengo es esto:
Código:
$ ./main

Proceso padre trabajando


Los pid de los procesos son:
Proceso padre trabajando
Proceso hijo trabajando

Los pid de los procesos son:
5726, 5727, 5726, 0,
Como veis, uno de los procesos hijo tiene un pid, y no debería. Además ¡otro se identifica como padre!. Según el libro que leo, fork() devuelve 0 si es un hijo el que lo llama. Entonces me llama la duda de si esta permitido crear dos procesos, pues en el libro que tengo no dice nada relacionado con esto. Y si no es este el problema, ¿por donde van los tiros?

Gracias de antemano ;)

Lh: No hagas doble post :D

Vaya tela me maree yo solo. Hoy abro el código y el libro que seguía y se me pasaron dos cosas. Fork hace una copia del proceso, "tal y como está". Pero se me paso pensar que sigue por donde seguía el padre en el momento del fork. Y otra... no he podido estar mas ciego al ver que he puesto un cero en lugar de la variable i, en el if que comprueba lo devuelto por fork; por esta razón uno se identificaba como padre, por que lee el pid que obtuvo el padre.

En fin, tema resuelto ^^