GNU/Linux >> Znalost Linux >  >> Linux

Proč musíme ve funkcích Exec předávat název souboru dvakrát?

Četl jsem Pokročilé programování v prostředí UNIX od Stevense, 8 kapitola.
Četl jsem a rozumím všem šesti funkcím exec.

Jedna věc, kterou jsem si všiml, je ve všech funkcích exec:

  • první argument je název souboru / název cesty (závisí na funkci exec).
  • druhý argument je argv[0], který získáme v main() , což je samotný název souboru.

Zde tedy musíme ve funkci předat název souboru dvakrát.

Existuje pro to nějaký důvod (například nemůžeme získat název souboru z názvu cesty z prvního argumentu)?

Přijatá odpověď:

Zde tedy musíme ve funkci předat název souboru dvakrát.

Nejsou úplně stejné, jak si všimnete, když si všimnete toho jednoho z nich se používá jako argv[0] hodnota. Toto nemusí být stejné jako základní název spustitelného souboru; mnoho/většina věcí to ignoruje a můžete si tam dát, co chcete.

První z nich je skutečná cesta ke spustitelnému souboru, pro který je zjevná nutnost. Druhý je předán procesu zdánlivě jako jméno použité k jeho vyvolání, ale např.:

execl("/bin/ls", "banana", "-l", NULL);

Bude fungovat dobře, za předpokladu /bin/ls je správná cesta.

Některé aplikace však využívají argv[0] . Obvykle mají jeden nebo více symbolických odkazů v $PATH; to je běžné u komprimačních nástrojů (někdy místo toho používají obaly shellu). Pokud máte xz nainstalován, stat $(which xzcat) ukazuje, že jde o odkaz na xz a man xzcat je stejný jako man xz což vysvětluje „xzcat je ekvivalentní xz –decompress –stdout“. Způsob, jakým xz může zjistit, jak bylo vyvoláno, je zaškrtnutí argv[0] , čímž jsou ekvivalentní:

execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);

Linux
  1. Jak poznám název souboru skriptu ve skriptu Bash?

  2. pomocí linuxu, jak mohu předat obsah souboru jako parametr spustitelnému souboru?

  3. předat stdout jako název souboru pro příkazový řádek util?

  1. najít soubory, které mají číslo v názvu souboru větší než

  2. Proč rozvětvení mého procesu způsobuje nekonečné čtení souboru

  3. Proč mají operační systémy omezení velikosti souborů?

  1. Proč skript Bash nerozpozná aliasy?

  2. Proč PC zamrzne, když kopíruji soubor na Pendrive?

  3. Proč má pvremove v manuálové stránce duplicitní sílu?