Hier müssen wir also den Dateinamen in der Funktion zweimal übergeben.
Sie sind nicht ganz dasselbe, wie Sie feststellen, wenn Sie beobachten, dass einer von ihnen als argv[0]
Wert verwendet wird. Dies muss nicht mit dem Basisnamen der ausführbaren Datei identisch sein. Viele / die meisten Dinge ignorieren es und Sie können alles hineinstecken, was Sie wollen.
Der erste ist der tatsächliche Pfad zur ausführbaren Datei, für die eine offensichtliche Notwendigkeit besteht. Der zweite wird angeblich als der Name, der zum Aufrufen verwendet wird, an den Prozess übergeben, aber z.
execl("/bin/ls", "banana", "-l", NULL);
Funktioniert gut, vorausgesetzt, es /bin/ls
ist der richtige Weg.
Einige Anwendungen verwenden jedoch argv[0]
. Normalerweise haben diese einen oder mehrere Symlinks $PATH
; Dies ist bei Komprimierungsprogrammen üblich (manchmal verwenden sie stattdessen Shell-Wrapper). Wenn Sie xz
installiert ist , stat $(which xzcat)
zeigt es ist ein Link zu xz
, und man xzcat
ist die gleiche wie man xz
die erklärt , „xzcat äquivalent zu xz --decompress --stdout“. Die Art und Weise, wie xz erkennen kann, wie es aufgerufen wurde, besteht darin, Folgendes zu überprüfen argv[0]
:
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);
busybox
kann, was Sie wollen, je nachdem, wie Sie es richtig nennen?