Come usare execl (esempio incluso)

Come usare execl (esempio incluso)

execl è una delle famiglie di chiamate exec che fungono da front-end per execve. Lo screenshot seguente si riferisce a man execl:

Gli argomenti per queste sette funzioni exec sono difficili da ricordare. Le lettere nei nomi delle funzioni aiutano in qualche modo. La lettera p significa che la funzione accetta un argomento di nome file e utilizza la variabile di ambiente PATH per trovare il file eseguibile. La lettera l significa che la funzione accetta un elenco di argomenti e si esclude a vicenda con la lettera v, il che significa che accetta un vettore argv[]. Infine, la lettera e significa che la funzione accetta un array envp[] invece di utilizzare l'ambiente corrente.

Nel post "Using execve" abbiamo visto come può essere utilizzato per avviare un nuovo processo e anche passare argomenti ad esso. execl lancia anche un nuovo processo che sostituisce quello attuale. La sintassi di execl è:

int execl(const char *path, const char *arg, ...);

Argomenti :
percorso :Percorso dell'eseguibile che deve essere eseguito da escl.
arg... :serie di puntatori agli argomenti che devono essere passati all'eseguibile.

In execve dovevamo passare un array di puntatori come argomenti, ma in execl possiamo passare direttamente i puntatori come argomenti. Questi argomenti devono essere terminati con NULL.

Esempio

1. Scriviamo un semplice programma per stampare gli argomenti passati.

# vi hello.c
#include <stdio.h>
main(int argc,char *argv[],char *envp[]){

printf("Filename: %s\n",argv[0]);
printf("%s %s\n",argv[1],argv[2]);
}

2. Per convenzione il primo argomento dovrebbe essere sempre il nome del file e seguiremo lo stesso. Compiliamo questo e chiamiamo l'eseguibile "ciao"

# cc hello.c -o hello

3. Ora scriviamo un programma per eseguire l'eseguibile "ciao" usando execl.

# vi execl.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main() {
char *temp,*temp1,*temp2;
temp="hello";  //filename
temp1="Funny"; 
temp2="world";

execl("hello",temp,temp1,temp2,NULL);
printf("Error");
}

4. Compila il codice ed eseguilo:

# cc execl.c -o execl
./execl 

Uscita:

Filename: hello
Funny world

Pertanto il programma potrebbe eseguire correttamente l'eseguibile "ciao" e anche passargli gli argomenti. Inoltre, nota che execl non è tornato alla funzione chiamante, altrimenti avrebbe stampato l'istruzione "Error" dopo la chiamata a execl.