Leí Programación avanzada en el entorno UNIX por Stevens, capítulo 8.
Leo y comprendo las seis funciones ejecutivas.
Una cosa que noto es, en todas las funciones ejecutivas:
- el primer argumento es el nombre del archivo/nombre de la ruta (depende de la función exec).
- el segundo argumento es argv[0] que obtenemos en
main()
, que es el propio nombre del archivo.
Así que aquí tenemos que pasar el nombre del archivo dos veces en la función.
¿Hay alguna razón para ello (como que no podemos obtener el nombre del archivo del nombre de la ruta del primer argumento)?
Respuesta aceptada:
Así que aquí tenemos que pasar el nombre del archivo dos veces en la función.
No son exactamente lo mismo que notas al observar que uno de ellos se usa como argv[0]
valor. Esto no tiene que ser el mismo que el nombre base del ejecutable; muchas/la mayoría de las cosas lo ignoran y puedes poner lo que quieras allí.
El primero es la ruta real al ejecutable, para el cual existe una necesidad obvia. El segundo se pasa al proceso aparentemente como el nombre usado para invocarlo, pero, por ejemplo:
execl("/bin/ls", "banana", "-l", NULL);
Funcionará bien, asumiendo /bin/ls
es la ruta correcta.
Sin embargo, algunas aplicaciones hacen uso de argv[0]
. Por lo general, estos tienen uno o más enlaces simbólicos en $PATH
; esto es común con las utilidades de compresión (a veces usan envoltorios de shell en su lugar). Si tienes xz
instalado, stat $(which xzcat)
muestra que es un enlace a xz
, y man xzcat
es lo mismo que man xz
lo que explica que “xzcat es equivalente a xz –descomprimir –stdout”. La forma en que xz puede saber cómo se invocó es comprobando argv[0]
, haciendo que estos sean equivalentes:
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);