Wie schreibt man ein C-Programm, um ein anderes Programm auszuführen?

Lesezeit: 4 Minuten

Benutzer-Avatar
wa-ha

Unter Linux möchte ich ein C-Programm schreiben, das ein anderes Programm startet. Wenn das Programm ausgeführt wird, wartet die Shell darauf, dass Sie einen Befehl eingeben, den Sie in Ihrem Programm definiert haben. Dieser Befehl startet das zweite Programm.

Angenommen, es gibt ein einfaches C-Programm namens “hello” im selben Verzeichnis wie das aufrufende Programm. Das „hello“-Programm gibt die Ausgabe „hello, world“ aus. Das erste Programm würde laufen und der Benutzer würde den Befehl “Hallo” eingeben. Das “Hallo”-Programm würde ausgeführt und “Hallo, Welt”. würde an die Shell ausgegeben werden.

Ich habe etwas gesucht, und Leute haben die Funktionen “fork()” und “exec()” vorgeschlagen. Andere sagten, sie würden “system()” verwenden. Ich habe keine Ahnung von diesen Funktionen. Wie rufe ich diese Funktionen auf? Sind sie anwendungsgerecht?

Beispielcode mit Erklärungen wäre am hilfreichsten. Andere Antworten sind auch willkommen. Ihre Hilfe wird gerne in Anspruch genommen.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* for fork */
#include <sys/types.h> /* for pid_t */
#include <sys/wait.h> /* for wait */

int main()
{
    /*Spawn a child to run the program.*/
    pid_t pid=fork();
    if (pid==0) { /* child process */
        static char *argv[]={"echo","Foo is my name.",NULL};
        execv("/bin/echo",argv);
        exit(127); /* only if execv fails */
    }
    else { /* pid!=0; parent process */
        waitpid(pid,0,0); /* wait for child to exit */
    }
    return 0;
}

  • Warum ist echo in dem argv variabel und in der execv Anruf?

    – Benutzer

    5. Oktober 2016 um 19:43 Uhr

  • @User, weil es argv ist[0]dh Programmname.

    – 0andriy

    9. Januar 2017 um 23:57 Uhr

  • Die Redundanz könnte reduziert werden, indem das erste Argument auf abgeleitet wird execv vom ersten Element in der argv Reihe oder umgekehrt?

    – Qiang Xu

    28. Juli um 19:20 Uhr

Benutzer-Avatar
Terminal

Wenn Sie mit Fork noch nicht vertraut sind, könnte eine grafische Darstellung von Fork und Exec für Sie hilfreich sein.

Darstellung von fork()

  +-------------+  
  |main program |  
  +-------------+    (fork())
        |___________________________  
  +-------------+                   |
  |main program |           +-------------+ 
  +-------------+           |main program |
        |                   +-------------+  
  +-------------+                   |        (exec())
  |main program |           +-------------+
  +-------------+           |hello program|
                            +-------------+  

Wie Sie vielleicht schon in einem Tutorial gelesen haben, nach dem Aufruf fork() eine doppelte Kopie des vorhandenen Programms wird erstellt, und die exec() ersetzt danach diese Kopie durch das neue Programm, das Sie ihm als Argumente übergeben. Danach laufen zwei Ausführungseinheiten für zwei Programme fork().

Gewohnheit system() genug für dich?

/* ... */
if (!strcmp(cmd, "hello")) system("hello.exe");
/* ... */

  • es ist linux, also ist es wahrscheinlich, dass keine exe gefunden wird. Es kann jedoch ein beliebiger Name sein.

    – Wladimir Iwanow

    28. März 2011 um 14:30 Uhr

  • @Vladimir: Das OP gibt an, dass das Programm “hello.c” ist. Das ist es höchstwahrscheinlich nicht – ich wollte ihn nur in die richtige Richtung weisen, wenn er mein Snippet ausprobiert 🙂

    – pmg

    28. März 2011 um 14:33 Uhr

  • @visi: <cstdlib> ist wahrscheinlich die C++-Version; die C-Version ist in deklariert <stdlib.h>

    – pmg

    28. März 2011 um 14:34 Uhr

  • Vielen Dank für Ihre schnelle Antwort. Können Sie die Funktion “system()” etwas näher erläutern oder mir ein weiteres Beispiel für den Aufruf dieser Funktion zeigen?

    – wa-ha

    28. März 2011 um 15:14 Uhr

  • @charlie: du kannst auf das System in meinem Beitrag klicken, um zu einer Beschreibung der Funktion zu gelangen. Grundsätzlich ist das, was Sie in die Klammern einfügen, das, was Sie in die Shell schreiben würden. Ihr Programm führt das aus und wartet, bis es endet.

    – pmg

    28. März 2011 um 15:23 Uhr

Für den einfachsten Fall sollten Sie zwei kompilierte Programme in einem Verzeichnis haben:

> ls
.
hello
second

Im zweiten Programm brauchen Sie nur anzurufen system("hello");

Benutzer-Avatar
Basile Starynkevitch

Ich habe etwas gesucht, und die Leute haben das vorgeschlagen fork() und exec() Funktionen. Andere sagten zu verwenden system(). Ich habe keine Ahnung von diesen Funktionen. Wie rufe ich diese Funktionen auf? Sind sie anwendungsgerecht?

Ja. Lesen Sie zuerst die Dokumentation (man Seite), zB von Gabel(2), ausführen(3), System(3). Sehr wahrscheinlich haben Sie diese Dokumentation lokal auf Ihrem Computer und verwenden sie Mann (1). Beachte das system Verwendet sh (durch bash(1) oder Strich(1)), denn es ist fork-ing, Exekutive(2)-ing und wartenpid(2)-ing die /bin/sh POSIX-Shell.

ich denke, dass fork ist schwer zu verstehen weil es bei Erfolg “zweimal” zurückkehrt. Ich werde nicht versuchen, es hier zu erklären (dafür brauche ich viele Seiten). Ich empfehle zu lesen Fork (Systemaufruf) Wikiseite zuerst. Lesen Sie dann ein gutes Linux-Programmierbuch, z Fortgeschrittene Linux-Programmierung (kostenlos herunterladbar).

Lesen Sie auch über Virtueller Adressraumund proc(5).

Du könntest auch lesen Betriebssysteme: Drei einfache Teile für eine allgemeinere Ansicht.

1385280cookie-checkWie schreibt man ein C-Programm, um ein anderes Programm auszuführen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy