2017-12-21 19 views
1

私は、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>

答えて

2

あなただけの必要があります。

sh -c 'exec command' 

シェルは、あなたのコマンドを使用して自分自身を置き換え、道から外れ、その中間のプロセスがありません。

いいえ、あなたはpidが1つずつ異なると見なすことはできません。

0

スポーンされたプロセスのPIDが常にshのPIDよりも1つ高いと思いますか?これまでのすべてのテストでは、それはそのように動作しました。

いいえLinuxはマルチタスクOSです。まれですが、他のプロセスが間に開始される可能性があります。競合状態に頼らないでください。そうでない場合

、その後、私のプログラムはちょうどpgrep -P <sh PID>を実行することよりも、親プロセスのPIDを知っている子プロセスのPIDを取得するために、よりエレガントな方法(システムコールまたはそのような)があるのでしょうか?

実際はありません。プロセスツリーを移動しようとすると、あなたのアプローチが間違っているという兆候です。

あなたは間違った問題を解決しています。シェルの中間人を取り除く。

+0

シェルミドルマンはこの小さな問題でも私の人生をはるかに簡単にします。すなわち、私のプログラムを正しいディレクトリで実行し、私の引数を解析します。安価な回避策が必要な場合でも、それを維持することは非常に便利です... – user1803425

+1

コマンド終了後にシェルが必要ですか? 'exec'で長時間実行しているコマンドを実行するだけで、シェルのpidが継承されます(シェルプロセスはあなた自身のコマンドで置き換えられます) –

+0

簡単なkludgesに抵抗します。正しいことをします。 –

関連する問題