Bashでsigprocmaskを呼び出す

Bashでsigprocmaskを呼び出す

bashコマンドを生成するプロセスがあり、system()信号マスクがすべての信号をブロックしました。これは簡単に解決できません。

bashコマンドは最終的にexecプロセスに入ります。ブロックされたすべての信号マスクはbashを介して元のプロセスから最終プロセスに継承されるため、最終的にすべての信号に「免疫」されるプロセスになります(もちろんなどは除くSIGKILLSIGSTOP

解決策はsigprocmaskbashでリセットすることですが、関連するコマンドが見つかりません。できますか?

ベストアンサー1

純粋なbashソリューションがないようです。

Ksh(ksh93とmksh)はすべての信号のブロックを解除するので(Debian wheezyでテストされています)、bashの代わりにkshを使用できれば問題は解決します。

bashが呼び出されるという事実を変更できない場合は、bashにkshを実行し、kshに子プロセスを実行させることができます。

bash -c '…; exec child_process'

渡す

bash -c '…; exec ksh -c "exec child_process"'

引用の問題に注意してください!

Kshは高速で使いやすいですが、通常はデフォルトのインストールには含まれていません。これが問題であれば、ほとんどの非組み込みLinuxシステムでは、基本インストールの一部であるPerlを使用できます。

perl -e '
    use POSIX;
    $s = POSIX::SigSet->new(); $s->fillset();
    sigprocmask(1, $s, $s) or die $!;    # 1 = SIG_UNBLOCK
    exec "child_process"'

おすすめ記事