私は4つの他のバイナリを起動するシェルスクリプトを持っています。 SIGSTOPをシェルスクリプトに送信しています。他の4つのプロセスもすべて停止しますか?そうでない場合、SIGSTOPをこれらのプロセスに転送するにはどうすればよいですか? SIGCONTの場合も同様です。シェルスクリプトから起動したすべてのプロセスにSIGSTOPを送る方法
すべての4つのバイナリのCソースコードがあります。
私は4つの他のバイナリを起動するシェルスクリプトを持っています。 SIGSTOPをシェルスクリプトに送信しています。他の4つのプロセスもすべて停止しますか?そうでない場合、SIGSTOPをこれらのプロセスに転送するにはどうすればよいですか? SIGCONTの場合も同様です。シェルスクリプトから起動したすべてのプロセスにSIGSTOPを送る方法
すべての4つのバイナリのCソースコードがあります。
シェルスクリプトを実行する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に移動します。
プロセスがグループを構成する場合は、標準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)"
これは、@ Jasonが述べた関数の代わりにどういうものか分かりません。なぜなら、最初にプロセスをプロセスグループに入れなければならないからです。これは 'killpg'呼び出しを置き換えます。 –
@Ben - まさに私が意味していたものです。申し訳ありませんが、私はそれをもっと明確にすることができました。私は最小限のサンプルを投稿する習慣をつけており、時にはいくつかの高密度ラインを追加することは、それが解決するよりも混乱を招くようです... – sehe
を助けるかもしれないと私には思えます。 –
実行中のシェルスクリプトは、コマンドラインから実行されているのですか、forkされた子プロセスから 'execvp'などを介して実行されていますか? – Jason