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/lssia 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 xzinstallato, stat $(which xzcat)mostra che è un collegamento a xz, ed man xzcatè lo stesso man xzche 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);
busyboxpuò essere quello che vuoi che dipenda da come lo chiami giusto?