Esto lo escribo porque en una de mis ultimas practicas me surgió este problema y me costo casi dos semanas el conseguir arreglarlo.
La cosa esta en que si utilizamos la función pvm_spawn() sin pasar le argumentos al ejecutable va perfectamente pero si queremos pasar le argumentos ya es otra historia, que realmente es igual de sencillo solo que hay que conocer algunas cosas.
pvm_spawn( char *task, char **argv, int flag, char *where, int ntask, int *tids )
No voy a entrar en detalle de que es cada uno de los parámetros de la función. Para eso esta el man de linux.
Primero empezamos con un ejemplo sin argumentos:
pvm_spawn("nombreProceso", NULL, PvmTaskDefault, NULL, numeroProcesos, tidsHijos);
Si utilizamos como segundo parámetro NULL, es decir, no pasamos argumentos. Todo funciona de marabilla.
El problema surge cuando la función main del hijo necesita argumentos de entrada. En mi caso pasaba que el mismo ejecutable servia de padre y de hijo. El ejecutable tenia dos argumentos obligatorios en los que podías seleccionar si ejecutar el programa en modo monoprocesador o multiprocesador. Por ello para que al crear los hijos no me dieran un error de parámetros incorrecto debía de pasarle esos dos argumentos. Empecemos con un ejemplo y luego lo cometo:
char* argv[3];
int tam1 = (strlen(”Argumento1″)+1);
int tam2 = (strlen(”Argumento2″)+1);
argv[0] = (char *)malloc(tam1 * sizeof(char));
argv[1] = (char *)malloc(tam2 * sizeof(char));
sprintf(argv[0], “Argumento1″);
sprintf(argv[1], “Argumento2″);
argv[2]=0;
int numCreados = pvm_spawn(”ejecutable”, (char**)argv, PvmTaskDefault, NULL, numProcesos,tidsHijos);
Primero tengo que crear el vector de parámetros. Yo lo creo de forma estática ya que conozco de antemano el numero de parámetros. Después cuento del tamaño que ocupa cada uno de los parámetros para no reservar más memoria de la necesaria. Después creo la memoria. y por ultimo le asigno valor. Todos estos paso se pueden hacer de otras maneras ya que el vector podria ser un doble puntero y podria haber asignado el valor con strcpy. Cada uno que haga las cosas a su gusto.
Ahora viene lo importante. Como los mas avispados se habrán dado cuenta que aunque tengo 2 parámetros creo un vector de 3 posiciones y luego como se puede ver en la linea en negrita asigno a 0 el ultimo parámetro aunque también le podría a ver asignado NULL. Esto es porque la función pvm_spawn() no tiene un argumento de entrada que le diga cuantos parámetros le llegan. Por ello utiliza la función strlen() para comprobar cuantos hay. Como muchos ya sabrán esta función necesita que en la ultima posición haya un NULL para saber cuando hay que parar, si no se pone esa ultima asignación pvm_spawn() da violación de segmento y al utilizar el valgrind es cuando nos damos cuenta que el error esta en strlen().
Espero que os sea de ayuda. Se que no es algo difícil pero si no lo sabes y te lo dan hecho se agradece.
Este post ha sido escrito por José Javier Martínez Domene



Octubre 14th, 2008 at 05:03
Hello.
reflects the couple’s low-key approach to their royal connections.
Bye.
Septiembre 5th, 2009 at 13:27
kundanbaug kofi neighbour edited readily insure ezra
Berberados Lemesarios