2010-08-10 26 views
7

He leído que el primer miembro de la matriz de argv siempre será el nombre del programa.Manejando `argv` en un programa de línea de comando C

¿Alguna vez es útil aferrarse a esto? Estoy aprendiendo, así que perdóname por favor si es una pregunta tonta.

¿Alguna vez la gente deshace el primer miembro porque es inútil (y restablece argv para ser uno menos?), O lo deja allí como la mejor práctica porque la gente espera que siempre esté allí (y para que funcione del caja con argc)?

+0

Relacionados: http://stackoverflow.com/questions/3304845/qstringlist-qcoreapplicationarguments-in-what-situation-is-index-0-not-the ... el primer miembro de la matriz argv no * siempre * sea el nombre del programa – sje397

+0

@ sje397 Gracias, buena información allí. – alex

Respuesta

7

He leído que el primer miembro de la matriz de argv siempre será el nombre del programa.

Es debe ser. C y C++ requieren que si argc es mayor que cero, argv[0] debe ser el nombre del programa o una cadena vacía.

Algunos sistemas no necesariamente siguen esta convención en todas las circunstancias (en Windows, por ejemplo, se puede utilizar CreateProcess para crear un nuevo proceso y no pasar el nombre del programa en los argumentos de línea de comandos que se utilizan para rellenar argc y argv)

¿Alguna vez es útil aferrarse a esto?

Sure. Si desea generar otra instancia de usted mismo, por ejemplo, o si desea imprimir el nombre de su programa (por ejemplo, en las instrucciones de uso).

¿Alguna vez la gente desvía el primer miembro porque es inútil o lo está dejando como mejor práctica?

No cambie los argumentos reales; la próxima persona que venga probablemente estará esperando que estén en su forma original.

+0

para la próxima persona! : D – Nyan

+0

La familia de llamadas al sistema 'exec()' de Unix también permite que 'argv [0]' se especifique independientemente del archivo para salir. El shell de inicio de sesión, por ejemplo, usualmente tiene una '-' 'inicial adjunta a su nombre por el proceso de inicio de sesión que usa esta característica. – RBerteig

4

Para ser precisos, argv[0] es lo que se transfiere a exec (2) que es convencionalmente el nombre del programa, pero podría ser cualquier cosa.

No deslocalíñelo porque demasiadas dependencias ocultas cuentan con él.

+0

¿Dependencias ocultas? No hay función 'exec'. Hay 'execve (2)' pero él y su familia requieren el nuevo nombre de archivo como argumento. ¿Por qué 'execl' el ejecutable actual? Eso solo reiniciaría todo. – Potatoswatter

3

Se espera que argv [0] siempre contenga el nombre del ejecutable. Debido a esto, nunca deberías eliminarlo.

En cuanto a si es útil, un uso para argv [0] es si desea que su aplicación cambie el comportamiento según cómo se llamó.

Busybox, por ejemplo, hace uso de esto en sistemas embebidos de Linux. Normalmente, tendría una copia única del ejecutable y crearía enlaces simbólicos al ejecutable con diferentes nombres. p.ej. cp, rm, ls, etc. Busybox luego determina qué función realizar en función del contenido de argv [0].

+0

Suena interesante, sin embargo, ¿eso es algo estándar o está limitado a la aplicación Busybox? – alex

+1

Es una técnica bastante estándar. También se usa en aplicaciones como ccache y distcc. –

+0

IIRC, muchas de las utilidades principales de "dos letras" se implementaron de la misma manera en System III y versiones anteriores de BSD. (¿Estoy mostrando mi edad aquí admitiendo haber * usado * el Sistema III?) – RBerteig

3

El primer argumento no es siempre el nombre del programa; depende de cómo se llame (consulte here).

A menudo, argv[0] se utiliza en los textos de ayuda:

fprintf(stderr, "Usage: %s <foo> [bar]\n", argv[0]); 

Desplazamiento de la matriz no es terriblemente útil o eficaz. También puede simplemente comenzar a usar argv desde el índice 1.

+0

@caf: ty 4 la edición :) – sje397

+1

'++ argv; - argc; 'desplaza eficientemente la matriz. Creo que eso es lo que significa OP. – Potatoswatter

0

contenido de argv [0] no está definido por ANSI. argv puede enumerado:

main(int argc,char**argv) 
{ 
    while(argc--) 
    puts(*argv++); 
    return 0; 
} 
0

De ISO C99, §5.1.2.2.1,

Si el valor de argc es mayor que cero, la cadena apuntada por argv [0] representa el nombre del programa; argv [0] [0] será el carácter nulo si el nombre del programa no está disponible desde el entorno host.

Por lo tanto, en las implementaciones conformes, se puede confiar en argv[0] como el nombre del programa si se prueba para su existencia antes (es decir, si se puede afirmar que argc > 0).

Cuestiones relacionadas