2012-11-26 16 views
6

Ich versuchte System(), aber irgendwie, wenn das sekundäre Programm ausgeführt wird, hängt mein Hauptprogramm (primäres Programm, das die sekundären ausführt)Wie starte ich eine ausführbare Datei in einem C++ Programm und bekomme ihre Prozess-ID (in Linux)?

und zweites Problem ist, wie bekomme ich die Prozess-ID des sekundären Programms in meinem Haupt Programm?

+0

Ich bin der Folge Fehler bekommen, wenn eine Gabel zu tun versuchen(), wenn ich einen fork() tun, ist es mir ein Fatal IO Fehler geben 11 (Resource vorübergehend nicht verfügbar) auf X, manchmal seine (Erfolg) oder (keine solche Datei oder Verzeichnis) – user1265478

+0

Lesen Sie http://advancedlinuxprogramming.com/ –

Antwort

4

Verwenden Sie fork um einen neuen Prozess zu erstellen, dann exec, um ein Programm im neuen Prozess auszuführen. Es gibt viele solche Beispiele.

11

Im übergeordneten Prozess möchten Sie fork.

Fork erstellt einen vollständig neuen Prozess und gibt entweder den untergeordneten Prozess pid an den aufrufenden Prozess und 0 an den neuen untergeordneten Prozess zurück.

Im untergeordneten Prozess können Sie dann etwas wie execl verwenden, um Ihr gewünschtes sekundäres Programm auszuführen. Im übergeordneten Prozess können Sie waitpid verwenden, um auf den Abschluss des untergeordneten Prozesses zu warten.

Hier ist ein einfaches illustratives Beispiel:

#include <iostream> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <cstdio> 
#include <cstdlib> 

int main() 
{ 
    std::string cmd = "/bin/ls"; // secondary program you want to run 

    pid_t pid = fork(); // create child process 
    int status; 

    switch (pid) 
    { 
    case -1: // error 
     perror("fork"); 
     exit(1); 

    case 0: // child process 
     execl(cmd.c_str(), 0, 0); // run the command 
     perror("execl"); // execl doesn't return unless there is a problem 
     exit(1); 

    default: // parent process, pid now contains the child pid 
     while (-1 == waitpid(pid, &status, 0)); // wait for child to complete 
     if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) 
     { 
      // handle error 
      std::cerr << "process " << cmd << " (pid=" << pid << ") failed" << std::endl; 
     } 
     break; 
    } 
    return 0; 
} 
+0

Ich denke, das sollte 'if (! WIFEXITED (Status) && ....'? Denn '! WIFEXITED (status)' ist immer wahr, nachdem Sie darauf gewartet haben, dass das Kind fertig ist. – Jeroen

+0

@Jeroen Ich glaube, es könnte 'WIFSIGNALED' sein? Vielleicht wäre es besser, 'if (WIFSIGNALED (status) || WEXITSTATUS (Status)! = 0) ' –

Verwandte Themen