Quindi qui dobbiamo passare il nome del file due volte nella funzione.
Non sono esattamente la stessa cosa che noti osservando che uno di essi viene utilizzato come argv[0]
valore. Questo non deve essere uguale al nome di base dell'eseguibile; molte / la maggior parte delle cose lo ignorano e puoi mettere quello che vuoi lì dentro.
Il primo è il percorso effettivo dell'eseguibile, per il quale esiste un'ovvia necessità. Il secondo viene passato al processo apparentemente come il nome usato per invocarlo, ma, ad esempio:
execl("/bin/ls", "banana", "-l", NULL);
Funzionerà bene, presumendo che /bin/ls
sia il percorso corretto.
Alcune applicazioni, tuttavia, ne fanno uso argv[0]
. Di solito questi hanno uno o più collegamenti simbolici $PATH
; questo è comune con le utility di compressione (a volte usano invece involucri shell). Se hai xz
installato, stat $(which xzcat)
mostra che è un collegamento a xz
, ed man xzcat
è lo stesso man xz
che spiega "xzcat è equivalente a xz --decompress --stdout". Il modo in cui xz può dire come è stato invocato è controllando argv[0]
, rendendo questi equivalenti:
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);
busybox
può essere quello che vuoi che dipenda da come lo chiami giusto?