Więc tutaj musimy dwukrotnie przekazać nazwę pliku w funkcji.
Nie są to dokładnie to samo, co zauważysz, obserwując, że jeden z nich jest używany jako argv[0]
wartość. To nie musi być taki sam jak basename pliku wykonywalnego; wiele / większość rzeczy ignoruje to i możesz włożyć tam, co chcesz.
Pierwszy to rzeczywista ścieżka do pliku wykonywalnego, dla którego istnieje oczywista konieczność. Drugi jest przekazywany do procesu pozornie tak, jak nazwa go wywołuje, ale np .:
execl("/bin/ls", "banana", "-l", NULL);
Będzie działać dobrze, zakładając, że /bin/ls
jest to właściwa ścieżka.
Jednak niektóre aplikacje wykorzystują argv[0]
. Zwykle mają one jeden lub więcej dowiązań symbolicznych $PATH
; jest to powszechne w przypadku narzędzi do kompresji (czasami używają zamiast tego owijarek powłok). Jeśli masz xz
zainstalowany, stat $(which xzcat)
pokazuje, że jest to link do xz
i man xzcat
jest taki sam, jak ten, man xz
który wyjaśnia „xzcat jest równoważne z xz --decompress --stdout”. Sposób, w jaki xz może stwierdzić, w jaki sposób został wywołany, polega na sprawdzeniu argv[0]
, czyniąc je równoważnymi:
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);
busybox
może wyglądać to, jak chcesz, w zależności od tego, jak to nazywasz?