私は、Dでスーパーバイド(ジョブ制御システム)を緩やかに再作成する必要のあるプロジェクトに取り組んでいます。私はspawnProcess()とは対照的に、spawnShell()これはsh -c "command"を実行する効果があります。しかし、それは子プロセスのshのPIDを返します(明らかな理由により)。これは問題になります。なぜなら、私のプログラムは、一定時間後にSIGTERMに応答しなければ、プロセスにSIGKILLを送ることができる必要があるからです。私はSIGTERMを問題なく送信することができます(おそらく、shはSIGTERMをキャッチし、それを子プロセス/プロセスに渡してから終了します)。しかし、明らかな理由からSIGKILLは、子プロセスにシグナルを送るチャンスを得る前に停止し、孤立したままになっています。これは私の質問に私をもたらします:sh -c "command"のSigkill子プロセス
A:スポーンされたプロセスのPIDが常にshのPIDよりも1つ高いと思いますか?これまでのすべてのテストでは、それはそのように動作しました。
B:そうでない場合は、私のプログラムを単に実行するよりも、親プロセスのPIDだけを知っている子プロセスのPIDを得るためのよりエレガントな方法(システムコールなど)がありますか?pgrep -P <sh PID>
?
シェルミドルマンはこの小さな問題でも私の人生をはるかに簡単にします。すなわち、私のプログラムを正しいディレクトリで実行し、私の引数を解析します。安価な回避策が必要な場合でも、それを維持することは非常に便利です... – user1803425
コマンド終了後にシェルが必要ですか? 'exec'で長時間実行しているコマンドを実行するだけで、シェルのpidが継承されます(シェルプロセスはあなた自身のコマンドで置き換えられます) –
簡単なkludgesに抵抗します。正しいことをします。 –