Entonces aquí tenemos que pasar el nombre del archivo dos veces en la función.
No son exactamente lo mismo que observa 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 lo cual existe una necesidad obvia. El segundo se pasa al proceso aparentemente como el nombre utilizado para invocarlo, pero, por ejemplo:
execl("/bin/ls", "banana", "-l", NULL);
Funcionará bien, suponiendo que /bin/ls
es el camino correcto.
Algunas aplicaciones, sin embargo, 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). Si lo ha xz
instalado, stat $(which xzcat)
muestra que es un enlace xz
y man xzcat
es el mismo man xz
que explica "xzcat es equivalente a xz --decompress --stdout". La forma en que xz puede determinar cómo se invocó es comprobando argv[0]
, haciendo estos equivalentes:
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);
busybox
puede ser lo que quieres que sea, dependiendo de cómo lo llames, ¿verdad?