significa - Usar ''__progname'' en lugar de argv
recibir parametros en c (7)
Es un BSDismo, y definitivamente no es portátil.
En el entorno C / Unix en el que trabajo, veo algunos desarrolladores que usan __progname en lugar de argv [0] para los mensajes de usage (). ¿Hay alguna ventaja en esto? ¿Cuál es la diferencia entre __progname y argv [0]? ¿Es portátil?
Si su programa se ejecutó utilizando, por ejemplo, un enlace simbólico, argv [0] contendrá el nombre de ese enlace.
Supongo que __progname contendrá el nombre del archivo de programa real.
En cualquier caso, argv [0] está definido por el estándar C. __progname no es.
También hay una extensión de GNU para esto, de modo que uno puede acceder al nombre de invocación del programa desde fuera de main () sin guardarlo manualmente. Sin embargo, podría ser mejor hacerlo manualmente; por lo tanto, es portátil en lugar de depender de la extensión de GNU. Sin embargo, aquí proporciono un extracto de la documentación disponible.
Del manual en línea de la Biblioteca GNU C (consultado hoy):
"Muchos programas que no leen entrada desde el terminal están diseñados para salir si falla alguna llamada del sistema. Por convención, el mensaje de error de dicho programa debe comenzar con el nombre del programa, sin directorios. Puede encontrar ese nombre en la variable program_invocation_short_name
; el nombre completo del archivo se almacena con la variable program_invocation_name
.
Variable: char * program_invocation_name El valor de esta variable es el nombre que se utilizó para invocar el programa que se ejecuta en el proceso actual. Es lo mismo que
argv[0]
. Tenga en cuenta que esto no es necesariamente un nombre de archivo útil; a menudo no contiene nombres de directorio.Variable: char * program_invocation_short_name El valor de esta variable es el nombre que se utilizó para invocar el programa que se ejecuta en el proceso actual, con los nombres de directorio eliminados. (Es decir, es lo mismo que
program_invocation_name
menos todo hasta la última barra, si corresponde).
El código de inicialización de la biblioteca configura ambas variables antes de llamar a main.
Nota de portabilidad: estas dos variables son extensiones de GNU. Si desea que su programa funcione con bibliotecas que no sean de GNU, debe guardar el valor de argv[0]
en main, y luego quitar los nombres de directorio usted mismo. Agregamos estas extensiones para que sea posible escribir subrutinas de informe de errores independientes que no requieren una cooperación explícita de la principal ".
Usar __progname
permite alterar el contenido de la matriz argv[]
mientras mantiene el nombre del programa. Algunas de las herramientas comunes como getopt()
modifican argv[]
mientras procesan los argumentos.
Para la portabilidad, puede strcopy argv[0]
en su propio búfer de nombre de programa cuando se inicia su programa.
Veo al menos dos problemas potenciales con argv [0].
Primero, argv [0] o argv en sí mismo pueden ser NULL si execve () llamador fue malvado o descuidado. Llamar a execve ("foobar", NULL, NULL) suele ser una forma fácil y divertida de demostrar que un programador confiado en su código no es a prueba de sig11.
También se debe tener en cuenta que argv no se definirá fuera de main () mientras que __progname generalmente se define como una variable global que se puede usar desde su función de uso () o incluso antes de llamar a main () (como constructores GCC no estándar) .
__progname es solo argv [0], y los ejemplos en otras respuestas aquí muestran las debilidades de su uso. Aunque tampoco es portátil, estoy usando readlink en / proc / self / exe (Linux, Android) y leyendo los contenidos de / proc / self / exefile (QNX).
__progname
no es estándar y, por lo tanto, no es portátil, prefiera argv[0]
. Supongo que __progname
podría buscar un recurso de cadena para obtener el nombre que no depende del nombre de archivo con el que lo ejecutó. Pero argv[0]
te dará el nombre en el que lo ejecutaron realmente , que sería más útil.