No entiendo cómo funciona execlp() en Linux

4 minutos de lectura

avatar de usuario
Arman Iqbal

He pasado los últimos 2 días tratando de entender el execlp() llamada al sistema, pero aquí estoy. Déjame ir directo al tema.

los man page de exclp declara la llamada al sistema como int execlp(const char *file, const char *arg, ...); con la descripción: El const char arg y los puntos suspensivos subsiguientes en las funciones execl(), execlp() y execle() se pueden considerar como arg0, arg1, …, argn.

Sin embargo, veo que la llamada al sistema se llama así en nuestro libro de texto: execlp(“/bin/sh”, ..., “ls -l /bin/??”, ...); (los “…” son para que los averigüemos como estudiantes). Sin embargo, esta llamada al sistema ni siquiera se parece en nada a la declaración en el man page de la llamada al sistema.

Estoy súper confundido. Cualquier ayuda es apreciada.

  • porque en la página del manual está la definición de la función y supongo que en tu libro de texto es un ejemplo de cómo usarla

    – alexis

    4 de febrero de 2014 a las 17:17

  • Tienes razón. Pero, ¿qué está tratando de hacer exactamente en el ejemplo anterior y cómo se está utilizando exactamente? Google tiene información muy pobre que siento en execlp().

    – Arman Iqbal

    04/02/2014 a las 17:32

  • ¿Qué quiere decir con que “ni siquiera se parece” a la declaración? los argumentos son char *. Eso se parece mucho a un char *!

    – William Pursell

    04/02/2014 a las 17:37

avatar de usuario
nos

este prototipo:

  int execlp(const char *file, const char *arg, ...);

Dice que exclp es una función de argumento variable. se necesitan 2 const char *. El resto de los argumentos, si los hay, son argumentos adicionales para entregar al programa que queremos ejecutar, también char * – todas estas son cadenas C (y el último argumento debe ser un puntero NULL)

Entonces el file argumento es el nombre de ruta de un archivo ejecutable que se ejecutará. arg es la cadena que queremos que aparezca como argv[0] en el ejecutable. Por convención, argv[0] es solo el nombre de archivo del ejecutable, normalmente está configurado de la misma manera que file.

los ... son ahora los argumentos adicionales para dar al ejecutable.

Digamos que ejecuta esto desde una línea de comando/shell:

$ ls

eso seria execlp("ls", "ls", (char *)NULL);
O si corres

$ ls -l /

eso seria execlp("ls", "ls", "-l", "https://stackoverflow.com/", (char *)NULL);

Pronto execlp("/bin/sh", ..., "ls -l /bin/??", ...);

Aquí vas al shell, /bin/sh , y le estás dando al shell un comando para ejecutar. Ese comando es “ls -l /bin/??”. Puede ejecutarlo manualmente desde una línea de comando/shell:

 $ ls -l /bin/??

Ahora, ¿cómo ejecuta un shell y le dice que ejecute un comando? Abre la documentación/página man de tu shell y léela.

Lo que quieres ejecutar es:

$ /bin/sh -c "ls -l /bin/??"

esto se convierte

  execlp("/bin/sh","/bin/sh", "-c", "ls -l /bin/??", (char *)NULL);

Nota al margen: El /bin/?? está haciendo coincidencia de patrones, esta coincidencia de patrones la realiza el shell y se expande a todos los archivos en /bin/ con 2 caracteres. Si simplemente lo hicieras

  execlp("ls","ls", "-l", "/bin/??", (char *)NULL);

Probablemente no pasaría nada (a menos que haya un archivo realmente llamado /bin/??) ya que no hay un shell que interprete y expanda /bin/??

  • ¿Hay algún archivo de encabezado especial que necesite para ejecutar comandos de shell como este? Probé los ejemplos anteriores y recibí un montón de errores como error: stray ‘\235’ in program y error: too few arguments to function ‘execlp’. Supongo que se debe a que falta un archivo de encabezado. Usé la función así: execlp(“/bin/sh”,“/bin/sh”, "-c", mystring, (char *)NULL); donde mystring es una variable de cadena que contiene una cadena de entrada de cualquier comando bash que desee execlp() ejecutar.

    – Arman Iqbal

    04/02/2014 a las 20:14


  • @ArmanIqbal Las citas de alguna manera cambiaron aquí. Pero esto es código C, así que cambie las cadenas para que estén entre comillas dobles. Estas: " También lea la página del manual para exclp para saber qué archivos de encabezado debe incluir

    – nos

    04/02/2014 a las 20:21


La limitación de execl es que cuando se ejecuta un comando de shell o cualquier otra secuencia de comandos que no se encuentra en el directorio de trabajo actual, debemos pasar la ruta completa del comando o la secuencia de comandos. Ejemplo:

execl("/bin/ls", "ls", "-la", NULL);

La solución para pasar la ruta completa del ejecutable es usar la función exclpque busca el archivo (1er argumento de execlp) en aquellos directorios señalados por PATH:

execlp("ls", "ls", "-la", NULL);

  • funcionará si uso execl(“/bin”, “ls”, “-la”, NULL); solo menciona el nombre del directorio en lugar de la ruta completa del archivo.

    – pankaj kushwaha

    19 de septiembre de 2015 a las 13:07

  • @pankajkushwaha: No, el primer argumento debe apuntar al archivo ejecutable que desea ejecutar

    – lihudi

    21 de septiembre de 2015 a las 8:11

  • No necesariamente tiene que pasar la ruta completa; por ejemplo puedes pasar ../bin/some_command.

    –Keith Thompson

    10 mayo 2016 a las 23:18

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad