GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué tenemos que pasar el nombre del archivo dos veces en las funciones ejecutivas?

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);

Linux
  1. Linux:¿por qué no hay un sistema de archivos Rootfs presente en el sistema?

  2. ¿Cómo pasar el contenido de un archivo como un parámetro de línea de comando?

  3. ¿Por qué Ls y Hexdump no están de acuerdo sobre el tamaño del archivo?

  4. Usando Linux, ¿cómo puedo pasar el contenido de un archivo como parámetro a un ejecutable?

  5. ¿Pasar stdout como nombre de archivo para la línea de comando util?

¿Cómo comprobar el nombre de la base de datos de Joomla?

¿Dónde está el archivo de encabezado <conio.h> en Linux? ¿Por qué no puedo encontrar <conio.h>?

encontrar archivos que tengan un número en el nombre de archivo mayor que

¿Por qué bifurcar mi proceso hace que el archivo se lea infinitamente?

No se puede cambiar el nombre de un archivo cuyo nombre comienza con un guión

¿Por qué el directorio raíz se indica con un signo /?