2012-11-26 20 views
6

ho provato system(), ma in qualche modo quando viene eseguito il programma secondario, il mio programma principale (programma primario che esegue il secondario) si bloccaCome avviare un eseguibile all'interno di un programma C++ e ottenere il suo id di processo (in linux)?

e il secondo problema è come ottengo l'id di processo del programma secondario nel mio principale programma?

+0

sto ottenendo l'errore seguito quando si cerca di fare un fork() quando faccio un fork(), mi danno un fatale errore di IO 11 (Resource temporaneamente non disponibile) su X, a volte su (Successo) o (Nessun file o directory) – user1265478

+0

Leggi http://advancedlinuxprogramming.com/ –

risposta

4

Utilizzare il fork per creare un nuovo processo, quindi eseguire exec per eseguire un programma nel nuovo processo. Ci sono molti esempi di questo tipo.

11

Nel processo principale si desidera fork.

Fork crea un processo completamente nuovo e restituisce il processo figlio pid nel processo chiamante e 0 nel nuovo processo figlio.

Nel processo figlio è quindi possibile utilizzare qualcosa come execl per eseguire il programma secondario desiderato. Nel processo principale è possibile utilizzare waitpid per attendere il completamento del figlio.

Ecco un semplice esempio illustrativo:

#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

Penso che questo dovrebbe essere "if (! WIFEXITED (stato) && ....'? Perché '! WIFEXITED (status)' è sempre vero dopo che hai aspettato che il bambino fosse completato – Jeroen

+0

@Jeroen Credo che potrebbe essere 'WIFSIGNALED'? Forse sarebbe più leggibile usare' if (WIFSIGNALED (stato) || WEXITSTATUS (stato)! = 0) ' –

Problemi correlati