2

可能であれば、実行可能ファイルを呼び出してプロセスを作成したいと思いますpopen。しかし、実際にはパイプを介して通信したくありません。そこにシグナルを送信したり、プロセスが実行されているかどうかを確認したり、送信後にプロセスが終了するのを待ったりするなど、Python の動作SIGINTと同じように制御したいのです。 multiprocessing. このような:

pid_t A = create_process('foo');
pid_t B = create_process('bar');

join(B); // wait for B to return
send_signal(A, SIGINT);

適切な方法は何ですか?

ユースケースの例:

  • 一連のプロセスを監視する (クラッシュしたときにプロセスを再起動するなど)

アップデート

答えがどちらの方向に進んでいるかがわかります: fork(). 次に、ユースケースを変更したいと思います: コンストラクターで文字列を受け取り、次のように指定されるクラスを作成したいと思います: オブジェクトがインスタンス化されると、(サブ) プロセスが開始されます (そして、クラスのインスタンス)、デストラクタが呼び出されると、プロセスは終了シグナルを取得し、プロセスが戻るとすぐにデストラクタが戻ります。

現在のユースケース: ブースト ステート チャートでは、ステートに入ったときにプロセスを開始し、ステートを離れたときに終了を送信します。http://www.highscore.de/boost/process/process/tutorials.html#process.tutorials.start_childは、私が探しているものに最も近いものだと思いますが、時代遅れに見えることを除けば。

それは非侵襲的な方法で可能ではありませんか?多分私は根本的な誤解をしており、この種の作業を行うためのより良い方法がある場合は、ヒントをいただければ幸いです.

更新 2

以下の回答のおかげで、少しアイデアが浮かんだと思います。この例では、"This is main" が 3 回 ("親" に対して 1 回、それぞれに対して 1 回) 印刷されると思っていましたfork()が、それは違います。So: 辛抱強い回答ありがとうございます!

#include <iostream>
#include <string>

#include <unistd.h>

struct myclass
{
    pid_t the_pid;
    myclass(std::string the_call)
    {
        the_pid = fork();
        if(the_pid == 0)
        {
            execl(the_call.c_str(), NULL);
        }
    }
};

int main( int argc, char** argv )
{
    std::cout << "This is main" << std::endl;
    myclass("trivial_process");
    myclass("trivial_process");
}
4

3 に答える 3

3

以下はまったく現実的なコードではありませんが、いくつかのアイデアを得ることができます。

pid_t pid = fork()
if (pid == 0) {
  // this is child process
  execl("foo", "foo", NULL);
}
// continue your code in the main process.
于 2012-09-06T17:45:40.997 に答える
1

以前に投稿されたコードを使用して、これを試してください:

#include <signal.h>
#include <unistd.h>

class MyProc
{
public:
  MyProc( const std::string& cmd)
  {
    m_pid = fork()
    if (pid == 0) {
      execl(cmd.c_str(), cmd.c_str(), NULL);
    }
  }

  ~MyProc()
  {
    // Just for the case, we have 0, we do not want to kill ourself
    if( m_pid > 0 )
    {
      kill(m_pid, SIGKILL);
      wait(m_pid);
    }
  }
private:
  pid_t m_pid;
}

この例で見られる欠点は、シグナルが発行された場合、プロセスが終了したことを確認できないことです (おそらく終了しないでしょう)。これは、OS が kill の直後に続行し、他のプロセスが遅延する可能性があるためです。 . これを確実にするために、pid への grep で ps ... を使用することができます。

編集:そこのコメントに出てきた待機を追加しました!

于 2012-09-06T18:39:44.923 に答える
0

fork()( man 2 fork)をご覧ください

于 2012-09-06T17:03:03.373 に答える