1

各プロセスを制御しながらプロセスを実行する必要があります。スレッドやpid、またはそのために必要なものを格納するクラスを作成したいと考えています。

私は現在、C 関数 execvp を使用して 1 つの外部アプリケーションを実行し、シェル スクリプトから環境をロードするプログラムを持っています。だから私の現在のプログラムはブロックしています。しかし、私はそれを自由に実行し続けることができる必要があり、現在実行中のアプリケーションを終了するか、新しい外部アプリケーションを開始するときまでにのみ実行する必要があります.

私の現在のアプローチは、execve 関数を使用するスレッドを作成することです。しかし、私が見る限り、スレッドはブロックされます。

スレッドにある可能性のあるコード(変数を使用):

char *argv[] = { "/bin/bash", "-c", "myApplication", 0 };
execve(argv[0], &argv[0], environment.data());

呼び出されるアプリケーションは、パラメータを含む外部セットアップ ファイルによって名前が付けられるコードでおそらく固定されていません。

私の実際の質問は、C ++でそのような外部アプリケーションを「管理」するためのより良い方法はありますか? いくつかの準備ができているソリューション (クラス、ライブラリ)? そうでない場合、これが実際の方法である場合、スレッドを終了するにはどうすればよいですか。終了呼び出しを使用することは悪い習慣であると言われています。それは私がよく読むものです。

これがフォーラムにとって十分に具体的であることを願っています。これ以上具体的にする方法がわからないからです。ここで作成したいものについてさらにヒントが必要な場合は、コメントでお気軽にお問い合わせください。

更新

DBus などへ:

追加情報 開始したいすべてのプロセスを書いているわけではありません。したがって、コードを持っていても変更したくないサードパーティのアプリケーションを起動するために使用されます。

4

2 に答える 2

3

実行するfork()前に必要です。サブプロセスとして実行されている元の呼び出し元と同じfork()新しいプロセスを作成する関数です。違いは、親プロセスが戻り値として子の pid を取得し、子が 0 を取得することです。やりたいことの要点は次のとおりです。fork()

pid_t pid = fork();

if( pid == 0 )
{
    // we're the child process
    char *argv[] = { "/bin/bash", "-c", "myApplication", 0 };
    int rc = execve(argv[0], &argv[0], environment.data());
    // execve only returns if there was an error
    // check 'errno' and handle it here
}
else if ( pid < 0 )
{
    // pid is less than zero, we didn't successfully fork,
    // there is no child process.
    throw "error message";
}

// do whatever processing the parent does

詳細はこちら。このkill()関数自体は悪い習慣ではありません。サブプロセスをすばやく適切に終了させたい場合は、シグナル ハンドラを記述できますが、 dbuszeromqなどを使用して適切なプロセス間通信を行う必要があります。プログラムに死ぬように指示するだけでなく、何かを実行するように指示したい (通常は、プログラムを強制終了する場合にやりたいこと)。

于 2015-08-04T19:20:16.027 に答える
3

execveexecv () システム コールは現在のプロセスイメージを新しいプロセス イメージでオーバーレイするため、スレッドで関数を使用しないでください。

fork-exec またはより良い vfork-exec の場合の正しいパターン。マンページからの抜粋:

vfork() システム コールを使用すると、古いプロセスのアドレス空間を完全にコピーせずに新しいプロセスを作成できますが、これはページ化された環境では非常に非効率的です。fork(2) の目的が、execve(2) 用の新しいシステム コンテキストを作成することであった場合に役立ちます。vfork() システムコールは、子が execve(2) への呼び出しまたは終了 (_exit(2) への呼び出しまたは異常) まで、親のメモリと制御スレッドを借用するという点で、fork(2) とは異なります。子がそのリソースを使用している間、親プロセスは中断されます。

vforkの直後にを使用execveすると、元のプロセス イメージのコピーを回避し、新しいプロセスの場合は消去しないため、元のプロセスはその子の pid と cat によって制御され、プロセスが終了したかどうかを確認し、シグナルを送信して、すぐ。

于 2015-08-05T09:03:15.203 に答える