¡Hola! Estoy trabajando con procesos en Unix y me encuentro con el siguiente problema: tengo dos procesos, un proceso padre (dad) y un número indeterminado de procesos hijos (son). Más allá de la funcionalidad del programa, no entiendo por qué se produce un error en la ejecución del proceso hijo al usar execl() en el proceso padre. Ilustro…
/****************************************************** dad <n> <t_max> genera n hijos que esperan un maximo de t_max segundos para devolver un caracter aleatorio ******************************************************/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #define NOMBRE_HIJO "son" #define PATH_HIJO "/home/usuario/procesos/son" /* Variables globales */ int n_procesos, t_max; pid_t *procesos; /* Funciones */ void parse_argv(int argc, char **argv); void init_procesos(); void generar_procesos(); void esperar_procesos(); void liberar_recursos(); /* Logica del programa */ int main(int argc, char **argv) { parse_argv(argc, argv); init_procesos(); generar_procesos(); esperar_procesos(); liberar_recursos(); return EXIT_SUCCESS; } /* parse_argv : tratamiento de la linea de ordenes */ void parse_argv(int argc, char **argv) { if(argc != 3) { fprintf(stderr, "[DAD] Error en el numero de argumentos. USO dad <n> <t_max>\n"); exit(EXIT_FAILURE); } n_procesos = atoi(argv[1]); t_max = atoi(argv[2]); printf("\n[DAD] Se crearan: %d procesos\n[DAD] Tiempo de espera maximo: %d segundos\n\n", n_procesos, t_max); } /* init_procesos : inicializar la tabla de procesos */ void init_procesos() { int i; procesos = malloc(n_procesos * sizeof(pid_t)); for(i = 0; i < n_procesos; i++) procesos[i] = 0; } /* generar_procesos : creacion de los procesos hijo */ void generar_procesos() { int i; for(i = 0; i < n_procesos; i++) switch(procesos[i] = fork()) { case -1: fprintf(stderr, "[DAD] Error en la creacion de proceso hijo\n"); liberar_recursos(); exit(EXIT_FAILURE); case 0: printf("[DAD] Se va a ejecutar el proceso %d\n", getpid()); if(execl(PATH_HIJO, NOMBRE_HIJO, t_max, NULL) == -1) { fprintf(stderr, "[DAD] Error en la ejecucion de proceso hijo %d\n", getpid()); exit(EXIT_FAILURE); } } sleep(1); } /* esperar_procesos : espera a finzalizacion de procesos hijo */ void esperar_procesos() { int i, j; pid_t pid; for(i = 0; i < n_procesos; i++) { pid = wait(NULL); printf("[DAD] El proceso hijo %d ha finalizado\n", pid); for(j = 0; j < n_procesos; j++) if(procesos[j] == pid) { procesos[j] = 0; break; } } } /* liberar_recursos : liberar espacio consumido por estructuras */ void liberar_recursos() { free(procesos); }
La salida proporcionada es, como ya he dicho:
[DAD] Error en la ejecucion de proceso hijo ...
¿Qué estoy haciendo mal? ¿Es problema de los argumentos que introduzco en la función execl()?
Un saludo y gracias.