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