Ho letto Programmazione avanzata nell'ambiente UNIX di Stevens, 8 capitolo.
Ho letto e compreso tutte e sei le funzioni exec.
Una cosa che noto è, in tutte le funzioni exec:
- il primo argomento è il nome del file/il nome del percorso (dipende dalla funzione exec).
- il secondo argomento è argv[0] che otteniamo in
main()
, che è il nome del file stesso.
Quindi qui dobbiamo passare il nome del file due volte nella funzione.
C'è qualche ragione per questo (come non possiamo ottenere il nome del file dal nome del percorso dal primo argomento)?
Risposta accettata:
Quindi qui dobbiamo passare il nome del file due volte nella funzione.
Non sono esattamente la stessa cosa che noti osservando quella uno di essi è usato come argv[0]
valore. Questo non deve essere lo stesso del nome di base dell'eseguibile; molte/la maggior parte delle cose lo ignorano e puoi metterci quello che vuoi.
Il primo è il percorso effettivo dell'eseguibile, per il quale esiste un'ovvia necessità. Il secondo viene passato al processo apparentemente come il nome utilizzato per invocarlo, ma, ad esempio:
execl("/bin/ls", "banana", "-l", NULL);
Funzionerà bene, presumendo /bin/ls
è il percorso corretto.
Alcune applicazioni, tuttavia, utilizzano argv[0]
. Di solito questi hanno uno o più collegamenti simbolici in $PATH
; questo è comune con le utilità di compressione (a volte usano invece i wrapper della shell). Se hai xz
installato, stat $(which xzcat)
mostra che è un collegamento a xz
e man xzcat
è lo stesso di man xz
che spiega "xzcat è equivalente a xz –decompress –stdout". Il modo in cui xz può dire come è stato invocato è selezionando argv[0]
, rendendo questi equivalenti:
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);