fork() no crea proceso hijo

Valrov

Buenas, ando haciendo unas practicas de Real-time programming y no se porque cuando llamo al fork() no me crea el proceso hijo, fijo que es una gilipollez que no estoy viendo asi que a ver si alguien ve el fallo y me evita los cabezazos contra la mesa

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/wait.h>

int main(void) {

pid_t pid;
int file, r, status;
char buffer [15];

file = open ("file.txt", O_CREAT|O_RDWR, 0777);
sprintf(buffer, "%d", file);

pid = fork();
printf("%d", pid); //este printf solo me esta imprimiendo el numero de proceso del padre

if (pid == 0){
	printf("ejecuta el child"); //y esto no me lo imprime, asi que por eso deduzco que no esta creando el hijo
	execl("./ex7child.exe", buffer, (char *) 0); 
}

r=waitpid(pid,&status,WNOHANG);
while (r==0){
	printf("\nParent is working");
	sleep(1);
	r=waitpid(pid,&status,WNOHANG);
	if (r>0){
		printf("\nChild has terminated");
	}
}


return 0;

}

muchas gracias por echarle un vistazo!!

Craw

No estoy seguro si es por eso, llevo un tiempo sin tocar esto, y solo le he echado un vistazo rápido pero creo que deberías separar la parte del hijo de la del padre (o metiendo las cosas en un switch, o poniendo un else por ahí). Tanto en el padre como en el hijo estás haciendo el r=waitpid(...), lo cual es un poco raro :S

Mir aa ver si esto te ayuda a guiarte:

main(void)
{
pid_t pid;

/*Creacion del proceso hijo */
pid=fork();
if (pid== -1)
{
	/*Error en la creacion*/
	printf("Error en la creacion hijo");
}
else
	if(pid==0)
	{
		/*Codigo del proceso hijo*/
		printf("\nSoy el proceso hijo\n");
		sleep(20);
	}
	else
	{
		/*codigo del proceso padre*/
		printf("\nSoy el proceso padre\n");
		pid=wait(NULL);
		printf("\nSoy el proceso padre.Ya ha terminado el proceso Hijo\n");
	}

}

1 respuesta
B

#2 El exec no retorna, así que si se ejecuta bien no debería continuar ejecutando ese código.

#1 comprueba si fork te devuelve un -1 o algo porque ese código no tiene nada que cante.

Valrov

ya descubri que era, estaba olvidando un parametro en el exec. Poniendo...

execl("./ex7child.exe", "ex7child.exe", buffer, (char *) 0);

como la seda

muchas gracias!

Ulmo

Vaya, yo siempre habia capturado los retornos de los fork en un entero, me ha descolocado completamente xD

Usuarios habituales