Cuidado sobre el manejo de argv[0] en las aplicaciones escritas en C/C++
Introducción.
Hay un detalle muy simple que debe tenerse en cuenta cuando se ejecutan en el cluster programas escritos en C y C++ con respecto al manejo de los parámetros de línea de comando que recibe el programa. En estos lenguajes siempre el primer parámetro, es decir argv[0], recibe el nombre y ruta del archivo ejecutable del programa que se está corriendo. Muchos desarrolladores utilizan este valor para conocer alguna información interesante como el directorio hogar del programa.
En Condor, debido a su arquitectura y método de ejecución de los procesos en los nodos trabajadores, esto tiene una variación que debe ser tenida en cuenta. El primer parámetro de línea de comando de los trabajos que se ejecutan en el cluster no hará referencia al programa como tal sino al condor_exec quien es el proceso que efectivamente ejecuta el programa en el nodo trabajador.
When Condor starts up your job, it renames argv[0] (which usually contains the name of the program) to condor_exec. This is convenient when examining a machine’s processes with the Unix command ps; the process is easily identified as a Condor job. Unfortunately, some programs read argv[0] expecting their own program name and get confused if they find something unexpected like condor_exec.
Tomado de la sección 2.15.1 del manual de Condor: Potencial problems, Renaming of argv[0].
Verificación.
Crear el programa de prueba.
$ vi argv0.c
#include <stdio.h>
int main(int argc, char* argv[])
{
int i = 0;
printf("\nParameters count: %d.\n\n", argc);
for(i=0; i<argc; i++)
{
printf("\tParameter '%d': %s.\n", i, argv[i]);
}
printf("\nDone!\n\n");
return 0;
}
Compilarlo (de una vez con soporte para el Cluster).
$ condor_compile gcc argv0.c -o argv0
Ejecución local.
$ ./argv0 p1 p2 p3 p4
Condor: Notice: Will checkpoint to ./argv0.ckpt
Condor: Notice: Remote system calls disabled.
Parameters count: 5.
Parameter ’0′: ./argv0.
Parameter ’1′: p1.
Parameter ’2′: p2.
Parameter ’3′: p3.
Parameter ’4′: p4.
Done!
Creación del archivo de envío de trabajos al cluster.
$ vi argv0.submit
executable = argv0 universe = vanilla output = argv0.out error = argv0.error log = argv0.log arguments = p1 p2 p3 p4
Enviar el trabajo al cluster.
$ condor_submit argv0.submit
Verificar la salida estándar del trabajo ejecutado.
$ cat argv0.out
Parameters count: 5.
Parameter ’0′: condor_exec.exe.
Parameter ’1′: p1.
Parameter ’2′: p2.
Parameter ’3′: p3.
Parameter ’4′: p4.
Done!
No related posts.
Category: Utilización | Tags: C, Cluster, Condor Comment »