execve execlp ejemplos ejemplo c linux exec

ejemplos - No entiendo cómo funciona execlp() en Linux



execlp c ejemplo (2)

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

La man page de execlp declara la llamada al sistema como int execlp(const char *file, const char *arg, ...); con la descripción: El const char arg y las siguientes elipsis 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 nosotros nos entendamos como estudiantes). Sin embargo, esta llamada al sistema no se parece en nada a la declaración en la man page del man page de la llamada al sistema.

Estoy super confundido. Cualquier ayuda es apreciada.


La limitación de execl es que al ejecutar un comando de shell o cualquier otro script que no se encuentre en el directorio de trabajo actual, debemos pasar la ruta completa del comando o el script. Ejemplo:

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

La solución para pasar la ruta completa del ejecutable es usar la función execlp , que busca el archivo (primer argumento de execlp) en los directorios señalados por PATH:

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


este prototipo:

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

Dice que execlp es una función de argumento variable. Se necesita 2 caracteres const char * . El resto de los argumentos, si los hay, son los argumentos adicionales que se deben entregar al programa que queremos ejecutar, también char * , todos estos son cadenas C (y el último argumento debe ser un puntero NULO)

Por lo tanto, el argumento del file 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 se establece en el mismo file .

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

Digamos que ejecutas esto desde una línea de comandos / shell:

$ ls

Eso sería execlp("ls", "ls", (char *)NULL); O si corres

$ ls -l /

Eso sería execlp("ls", "ls", "-l", "/", (char *)NULL);

Así que en execlp("/bin/sh", ..., "ls -l /bin/??", ...);

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

$ ls -l /bin/??

Ahora, ¿cómo ejecuta un shell y le dice que ejecute un comando? Abre la documentación / página de manual de su shell y la lee.

Lo que quieres ejecutar es:

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

Esto se convierte en

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

Nota al margen: El /bin/?? está haciendo una 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 hiciste

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

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