可能であれば、実行可能ファイルを呼び出してプロセスを作成したいと思います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");
}