execl je jednou z rodin volání exec, která fungují jako frontend pro execve. Následující snímek obrazovky odkazuje na man execl:
Argumenty pro těchto sedm exec funkcí jsou těžko zapamatovatelné. Trochu pomáhají písmena v názvech funkcí. Písmeno p znamená, že funkce přebírá argument názvu souboru a používá proměnnou prostředí PATH k nalezení spustitelného souboru. Písmeno l znamená, že funkce přebírá seznam argumentů a vzájemně se vylučuje s písmenem v, což znamená, že bere vektor argv[]. Nakonec písmeno e znamená, že funkce používá pole envp[] namísto použití aktuálního prostředí.
V příspěvku „Using execve“ jsme viděli, jak jej lze použít ke spuštění nového procesu a také mu předat argumenty. execl také spustí nový proces, který nahradí stávající. Syntaxe execl je:
int execl(const char *path, const char *arg, ...);
Argumenty :
cesta :Cesta ke spustitelnému souboru, který je třeba spustit pomocí execl.
arg… :Řada ukazatelů na argumenty, které je třeba předat spustitelnému souboru.
V execve jsme museli předat pole ukazatelů jako argumenty, ale v execlu můžeme ukazatele předat přímo jako argumenty. Tyto argumenty by měly být ukončeny hodnotou NULL.
Příklad
1. Napišme jednoduchý program pro tisk argumentů, které mu byly předány.
# 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. Podle konvence by první argument měl být vždy název souboru a my se budeme řídit stejným. Pojďme to zkompilovat a pojmenovat spustitelný soubor „hello“
# cc hello.c -o hello
3. Nyní napíšeme program, který spustí spustitelný soubor „hello“ pomocí 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. Zkompilujte kód a spusťte jej:
# cc execl.c -o execl ./execl
Výstup:
Filename: hello Funny world
Program tak mohl úspěšně spustit spustitelný soubor „hello“ a také mu předat argumenty. Všimněte si také, že execl se nevrátil k volající funkci, jinak by po volání execl vypsal příkaz „Error“.