GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum müssen wir den Dateinamen zweimal in Exec-Funktionen übergeben?

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

Linux
  1. Warum erkennt das Bash-Skript keine Aliase?

  2. Die Bash‘?

  3. Linux – Warum ist kein Rootfs-Dateisystem auf dem System vorhanden?

  4. Wie übergebe ich den Inhalt einer Datei als Befehlszeilenparameter?

  5. Warum wird der Dateideskriptor nur einmal geöffnet und gelesen?

Wie überprüfe ich den Namen der Joomla-Datenbank?

Wie kann ich unter Linux den Inhalt einer Datei als Parameter an eine ausführbare Datei übergeben?

stdout als Dateinamen für das Befehlszeilenprogramm übergeben?

Wo ist die Header-Datei <conio.h> unter Linux? Warum kann ich <conio.h> nicht finden?

Warum haben Betriebssysteme Dateigrößenbeschränkungen?

Eine Datei, deren Name mit einem Bindestrich beginnt, kann nicht umbenannt werden