Ich verstehe nicht, wie execlp() unter Linux funktioniert

Ich verstehe nicht, wie execlp() unter Linux funktioniert


Ich habe die letzten 2 Tage damit verbracht, den execlp() zu verstehen Systemaufruf, aber ich bin doch hier. Lassen Sie mich gleich zum Thema kommen.


Die man page von execlp deklariert den Systemaufruf als int execlp(const char *file, const char *arg, ...); mit der Beschreibung:Das const char arg und die nachfolgenden Ellipsen in den Funktionen execl(), execlp() und execle() können als arg0, arg1, ..., argn betrachtet werden.


Ich sehe jedoch, dass der Systemaufruf in unserem Lehrbuch so aufgerufen wird:execlp(“/bin/sh”, ..., “ls -l /bin/??”, ...); (die "..." müssen wir als Studenten herausfinden). Allerdings ähnelt dieser Systemaufruf überhaupt nicht der Deklaration auf man page des Systemaufrufs.


Ich bin super verwirrt. Jede Hilfe ist willkommen.


Antworten:


dieser Prototyp:


  int execlp(const char *file, const char *arg, ...);

Sagt, dass execlp eine variable Argumentfunktion ist. Es dauert 2 const char * . Der Rest der Argumente, falls vorhanden, sind die zusätzlichen Argumente, die wir an das Programm übergeben müssen, das wir ausführen möchten - auch char * - all dies sind C-Strings (und das letzte Argument muss ein NULL-Zeiger sein)


Also die file Argument ist der Pfadname einer auszuführenden ausführbaren Datei. arg ist die Zeichenfolge, die als argv[0] erscheinen soll in der ausführbaren Datei. Per Konvention argv[0] ist nur der Dateiname der ausführbaren Datei, normalerweise ist er auf file gesetzt .


Die ... sind nun die zusätzlichen Argumente, die der ausführbaren Datei zu übergeben sind.


Angenommen, Sie führen dies von einer Befehlszeile/Shell aus:


$ ls

Das wäre execlp("ls", "ls", (char *)NULL);
Oder wenn du rennst


$ ls -l /

Das wäre execlp("ls", "ls", "-l", "/", (char *)NULL);


Also weiter zu execlp("/bin/sh", ..., "ls -l /bin/??", ...);


Hier gehen Sie zur Shell, /bin/sh , und Sie geben der Shell einen auszuführenden Befehl. Dieser Befehl lautet "ls -l /bin/??". Sie können das manuell von einer Befehlszeile/Shell ausführen:


 $ ls -l /bin/??

Wie führen Sie nun eine Shell aus und weisen sie an, einen Befehl auszuführen? Sie öffnen die Dokumentation/Manpage für Ihre Shell und lesen sie.


Was Sie ausführen möchten, ist:


$ /bin/sh -c "ls -l /bin/??"

Dies wird zu


  execlp("/bin/sh","/bin/sh", "-c", "ls -l /bin/??", (char *)NULL);

Randnotiz:
Der /bin/?? Mustervergleich durchführt, dieser Mustervergleich wird von der Shell durchgeführt und erweitert sich auf alle Dateien unter /bin/ mit 2 Zeichen. Wenn Sie es einfach getan haben


  execlp("ls","ls", "-l", "/bin/??", (char *)NULL);

Wahrscheinlich würde nichts passieren (es sei denn, es gibt tatsächlich eine Datei mit dem Namen /bin/?? ), da es keine Shell gibt, die /bin/??

interpretiert und erweitert