2012-11-26 13 views
6

Sistem() denedim, ancak ikincil program çalıştığında, ana programım (ikincil yürüten birincil program)Bir C++ programında bir çalıştırmaya nasıl başlar ve işlem kimliğini (linux) nasıl alırsınız?

kilitleniyor ve ikinci sorun, ana programımdaki ikincil programın işlem kimliğini nasıl alabilirim Program?

+0

i bir çatal() i) (çatal yaptığınızda, bana bir Fatal IO hatası 11 vermek yapmaya çalışıyor takip hata alıyorum (Kaynak: İşte

basit örnektir X, bazen (Başarı) veya (böyle bir dosya veya dizin yok) – user1265478

+0

http://advancedlinuxprogramming.com/~~dobj (http://advancedlinuxprogramming.com/) –

cevap

4

Yeni bir işlem oluşturmak için çatalı kullanın, ardından yeni işlemde bir program çalıştırmak için yürüt. Böyle birçok örnek var. Üst işlemde, fork için

11

.

Çatal tamamen yeni bir işlem oluşturur ve çağrı işlemine pid alt sürecini ve yeni alt işlem için 0 değerini döndürür.

Çocuk işleminde, istediğiniz ikinci programı yürütmek için execl gibi bir şey kullanabilirsiniz. ebeveyn süreçte tamamlamak çocuk için beklemek waitpid kullanabilirsiniz.

#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

Çünkü WIFEXITED (status) ', çocuğun tamamlanmasını bekledikten sonra her zaman doğrudur – Jeroen

+0

@Jeroen 'WIFSIGNALED' olabileceğine inanıyorum? Belki de kullanması daha okunabilir olurdu eğer (WIFSIGNALED (status) || WEXITSTATUS (durum)! = 0) ' –

İlgili konular