Ich habe Fortgeschrittene Programmierung in der UNIX-Umgebung gelesen von Stevens, Kapitel 8.
Ich habe alle sechs Exec-Funktionen gelesen und verstanden.
Eine Sache, die mir auffällt, ist in allen exec-Funktionen:
- erstes Argument ist der Dateiname / Pfadname (abhängig von der exec-Funktion).
- zweites Argument ist argv[0], das wir in
main()
erhalten , das ist der Dateiname selbst.
Hier müssen wir den Dateinamen also zweimal in der Funktion übergeben.
Gibt es einen Grund dafür (wie wir den Dateinamen nicht aus dem Pfadnamen des ersten Arguments erhalten können)?
Akzeptierte Antwort:
Hier müssen wir den Dateinamen also zweimal in der Funktion übergeben.
Sie sind nicht ganz dasselbe, wie Sie feststellen, wenn Sie diesen einen beobachten davon wird als argv[0]
verwendet Wert. Dies muss nicht mit dem Basisnamen der ausführbaren Datei übereinstimmen; Viele/die meisten Dinge ignorieren es und Sie können dort einfügen, was Sie wollen.
Der erste ist der tatsächliche Pfad zur ausführbaren Datei, für den eine offensichtliche Notwendigkeit besteht. Der zweite wird dem Prozess angeblich als der Name übergeben, der verwendet wird, um ihn aufzurufen, aber z. B.:
execl("/bin/ls", "banana", "-l", NULL);
Wird gut funktionieren, vorausgesetzt /bin/ls
ist der richtige Pfad.
Einige Anwendungen verwenden jedoch argv[0]
. Normalerweise haben diese einen oder mehrere symbolische Links in $PATH
; Dies ist bei Komprimierungsdienstprogrammen üblich (manchmal verwenden sie stattdessen Shell-Wrapper). Wenn Sie xz
haben installiert, stat $(which xzcat)
zeigt, dass es sich um einen Link zu xz
handelt , und man xzcat
ist dasselbe wie man xz
was erklärt „xzcat ist äquivalent zu xz –decompress –stdout“. xz kann feststellen, wie es aufgerufen wurde, indem es argv[0]
prüft , wodurch diese äquivalent werden:
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);