GNU/Linux >> Linux Esercitazione >  >> Linux

Perché dobbiamo passare il nome del file due volte nelle funzioni Exec?

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);

Linux
  1. Perché il PC si blocca mentre sto copiando un file su una Pendrive?

  2. Il Bash '?

  3. Perché più istanze di Mate-terminal hanno lo stesso Pid?

  4. Come passare il contenuto di un file come parametro della riga di comando?

  5. Perché Ls e Hexdump non sono d'accordo sulla dimensione del file?

Perché lo script Bash non riconosce gli alias?

Linux:perché non è presente alcun file system Rootfs sul sistema?

Come controllare il nome del database Joomla?

usando Linux come posso passare il contenuto di un file come parametro a un eseguibile?

Perché la directory principale è indicata da un segno /?

Perché pvremove ha una forza duplicata nella pagina man?