Wie führe ich ein Shell-Skript von C in Linux aus?

Wie führe ich ein Shell-Skript von C in Linux aus?


Wie kann ich ein Shell-Skript von C unter Linux ausführen?


Antworten:


Es hängt davon ab, was Sie mit dem Skript (oder einem anderen Programm, das Sie ausführen möchten) machen möchten.


Wenn Sie nur das Skript system ausführen möchten ist am einfachsten, aber es erledigt auch einige andere Dinge, einschließlich das Ausführen einer Shell und das Ausführen des Befehls (/bin/sh unter den meisten *nix).


Wenn Sie das Shell-Skript entweder über seine Standardeingabe füttern oder seine Standardausgabe verwenden möchten, können Sie popen verwenden (und pclose ), um eine Pipe einzurichten. Dies verwendet auch die Shell (/bin/sh unter den meisten *nix), um den Befehl auszuführen.


Beides sind Bibliotheksfunktionen, die unter der Haube viel leisten, aber wenn sie Ihren Anforderungen nicht entsprechen (oder Sie nur experimentieren und lernen möchten), können Sie auch Systemaufrufe direkt verwenden. Dadurch können Sie auch vermeiden, dass die Shell (/bin/sh) Ihren Befehl für Sie ausführt.


Die interessierenden Systemaufrufe sind fork , execve , und waitpid . Möglicherweise möchten Sie einen der Bibliotheks-Wrapper um execve verwenden (geben Sie man 3 exec ein für eine Liste von ihnen). Sie können auch eine der anderen Wartefunktionen verwenden (man 2 wait hat sie alle). Zusätzlich könnten Sie die Systemaufrufe clone interessieren und vfork die sich auf Fork beziehen.


fork dupliziert das aktuelle Programm, wobei der einzige Hauptunterschied darin besteht, dass der neue Prozess 0 vom Aufruf von Fork zurückerhält. Der übergeordnete Prozess bekommt die Prozess-ID des neuen Prozesses (oder einen Fehler) zurückgegeben.


execve ersetzt das aktuelle Programm durch ein neues Programm (unter Beibehaltung der gleichen Prozess-ID).


waitpid wird von einem übergeordneten Prozess verwendet, um auf die Beendigung eines bestimmten untergeordneten Prozesses zu warten.


Da die Fork- und Execve-Schritte getrennt sind, können Programme einige Einstellungen für den neuen Prozess vornehmen, bevor er erstellt wird (ohne sich selbst zu vermasseln). Dazu gehören das Ändern von Standardeingabe, -ausgabe und stderr in andere Dateien als der verwendete übergeordnete Prozess, das Ändern des Benutzers oder der Gruppe des Prozesses, das Schließen von Dateien, die der untergeordnete Prozess nicht benötigt, das Ändern der Sitzung oder das Ändern der Umgebungsvariablen.


Vielleicht interessiert Sie auch der pipe und dup2 Systemaufrufe. pipe erstellt eine Pipe (mit sowohl einem Eingabe- als auch einem Ausgabedateideskriptor). dup2 dupliziert einen Dateideskriptor als einen spezifischen Dateideskriptor (dup ist ähnlich, dupliziert aber einen Dateideskriptor auf den niedrigsten verfügbaren Dateideskriptor).