2012-11-26 12 views
6

i)は(システムを試してみましたが、二次プログラムが実行さ何とかたときに、私のメインプログラム(二次を実行し、主プログラム)C++プログラム内で実行可能ファイルを起動し、そのプロセスIDを取得する方法(linux)?

をハングアップし、第二の問題は、私は私のメインの二次プログラムのプロセスIDを取得します方法ですプログラム?

+0

、それは私に致命的IOエラー11(リソースを与えます一時的に利用不可能)、時にはその(成功)または(そのようなファイルやディレクトリはありません) – user1265478

+0

http://advancedlinuxprogramming.com/を読んでください –

答えて

4

forkを使用して新しいプロセスを作成し、execを実行して新しいプロセスでプログラムを実行します。そのような例がたくさんあります。

11

親プロセスには、forkが必要です。

フォークはまったく新しいプロセスを作成し、子プロセスのpidを呼び出しプロセスに返し、0を新しい子プロセスに返します。

子プロセスでは、execlのようなものを使用して、目的のセカンダリプログラムを実行することができます。 親プロセスでは、waitpidを使用して、子プロセスが完了するまで待つことができます。ここで

は、簡単な説明のための例です:)((フォークをやろうとしたとき、私はフォークを行うときi)は次のエラーを取得しています

#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

これは 'if(!WIFEXITED(status)&&? – Jeroen

+0

@Jeroen私はそれが 'WIFSIGNALED 'であると信じていますか?おそらく' if(WIFSIGNALED(status)|| WEXITSTATUS (ステータス)!= 0) ' –

関連する問題