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