No siempre es así. Es el valor que le dio al programa por el sistema de operación. Por ejemplo al iniciar un programa utilizando exec
puede establecer que a un valor arbitrario:
int execve(const char *filename, char *const argv[],
char *const envp[]);
El primer parámetro es el archivo para iniciar, y la voluntad argv contiene argv [0] y todos los demás parámetros para las principales. envp contiene las variables de entorno (no definidas por Standard C o C++. Esto es una cosa posix).
Más precisamente, esta es la definición de argv en C++:
Una implementación no se predefinir la función principal. Esta función no debe estar sobrecargada. Deberá tener un tipo de retorno de tipo int, pero de lo contrario su tipo está definido por la implementación. Todas las implementaciones se permiten ambas de las siguientes definiciones de principal:
int main() { /* ... */ }
y
int main(int argc, char* argv[]) { /* ... */ }
En la forma última argc será el número de argumentos pasados a la programa del entorno en que ejecuta el programa. Si argc es distinto de cero estos argumentos se proporcionarán en argv[0]
través argv[argc-1]
como punteros a los caracteres iniciales de las cadenas terminadas en cero de varios bytes (NTMBSs) (17.3.2.1.3.2) y argv[0]
será el puntero al carácter inicial de un NTMBS que representa el nombre utilizado para invocar el programa o "". El valor de argc debe ser no negativo. El valor de argv[argc]
será 0. [Nota: se recomienda agregar cualquier parámetro adicional (opcional) después de argv. ]
Depende mucho de la implementación lo que define un "nombre usado para invocar el programa". Si desea obtener la ruta completa de su ejecutable, puede usar GetModuleFileName en Windows, y argv[0]
(para obtener el nombre utilizado para ejecutar, puede ser relativo) junto con getcwd
(para obtener el directorio de trabajo actual, tratando de hacer que el nombre absoluto).
Por ejemplo, un shell sabe que es un shell de inicio de sesión porque el inicio de sesión (1) hace que argv [0] comience con un guion. –
... y bash sabe que está en modo POSIX comparando argv [0] con "sh" :) por cierto, este truco de argv es lo que hace que busybox sea tan pequeño. todos los utils se empaquetan juntos en un binario que se acaba de ejecutar con diferentes valores de argv [0] –
Evitaré el realpath en los programas portátiles. La interfaz POSIX realpath está rota, porque no puede especificar el tamaño del búfer de destino, ni asignar uno lo suficientemente grande sin hacer suposiciones sobre PATH_MAX. – Doug