2011-07-01 8 views
1

私は4つの他のバイナリを起動するシェルスクリプトを持っています。 SIGSTOPをシェルスクリプトに送信しています。他の4つのプロセスもすべて停止しますか?そうでない場合、SIGSTOPをこれらのプロセスに転送するにはどうすればよいですか? SIGCONTの場合も同様です。シェルスクリプトから起動したすべてのプロセスにSIGSTOPを送る方法

すべての4つのバイナリのCソースコードがあります。

+0

を助けるかもしれないと私には思えます。 –

+0

実行中のシェルスクリプトは、コマンドラインから実行されているのですか、forkされた子プロセスから 'execvp'などを介して実行されていますか? – Jason

答えて

5

シェルスクリプトを実行するforked子プロセスでsetpgid()を呼び出すことができます。これにより、そのシェルスクリプトから子プロセスと同じグループIDが生成されます。 killpg()を使用して、そのグループ内のすべてのプロセスが受信する信号をグループ全体に送信することができます。

たとえば、setpgid(0, 0)と呼ばれる子プロセス内にある場合、これは、子プロセスのグループIDが子のPIDと同じ値に設定される特殊なインスタンスを設定します。関数のexecファミリの1つを使用して子プロセスにオーバーレイされたプロセスは、その子が持つグループIDと同じ値を持ちます。さらに、新しくオーバレイされたプロセスが生成する可能性のあるプロセスは、同じグループID(つまり、シェルスクリプト)を持ちます。 killpg()を使用すると、setpgid(0, 0)呼び出し後に、子プロセスのグループIDが子プロセスのPIDと同じ値であるため、返された子のPID値だけを使用して、グループID値を共有するプロセスに信号を送信することができます。

fork()を使用している場合、親プロセスから信号をグループに送信する必要があるかどうかによって、同期の問題が発生する可能性があります。たとえば、直ちにプロセスグループに信号を送信する子プロセスをフォークする。 1)フォークの代わりにvfork()を使用して、子がグループIDを変更してexecを正常に呼び出すまで中断させるか、または親プロセスのsetpgid()を呼び出します。も同様です子プロセスにと入力しますが、親の場合は、setgpid(0, 0)を子供の場合のように使用するのではなく、setpgid(CHILD_PID, CHILD_PID)を使用できます。それでは、どのコールが成功したかは関係ありません(そのうちの1つは成功し、もう1つはEACCESで失敗します)。そして、親から送信された連続するシグナルは、有効なグループIDに移動します。

+0

グループIDのエキスパートではありませんが、同じグループ内に他のプロセスはありませんか? –

+0

特別なケース 'setpgid(0、0)'を使用して、プロセスグループIDを子プロセスIDと同じ値に設定すると、そのチャンスはかなり遠いです。 – Jason

+0

プロセスAがシェルスクリプトBを起動するとします。プロセスAのグループIDは 'G'です。スクリプトBは、C、D、E、Fの4つのプロセスを起動します。C、D E&FはグループIDが 'G'ですか? – Jacob

1

プロセスがグループを構成する場合は、標準kill(1)を使用できます。 man killには、以下の情報があります。

pid... 
    Specify the list of processes that kill should signal. Each pid can be one of five things: 
n 
    where n is larger than 0. The process with pid n will be signaled. 
    All processes in the current process group are signaled. 
-1 
    All processes with pid larger than 1 will be signaled. 
-n 
    where n is larger than 1. All processes in process group n are signaled. When an argument of the form '-n' is given, and it is meant to denote a process group, either the signal must be specified first, or the argument must be preceded by a '--' option, otherwise it will be taken as the signal to send. 
commandname 

私がSIGSTOPを捕捉することはできないと思います「-n」仕様があなたに

kill -STOP -- "-$(pgrep myparentproc)" 
+0

これは、@ Jasonが述べた関数の代わりにどういうものか分かりません。なぜなら、最初にプロセスをプロセスグループに入れなければならないからです。これは 'killpg'呼び出しを置き換えます。 –

+0

@Ben - まさに私が意味していたものです。申し訳ありませんが、私はそれをもっと明確にすることができました。私は最小限のサンプルを投稿する習慣をつけており、時にはいくつかの高密度ラインを追加することは、それが解決するよりも混乱を招くようです... – sehe

関連する問題