次のような状況があります: スレッド 1: 子と子をフォークします。たとえば、A が再びフォークし、プロセスを実行します。B
スレッド 2: Unix ドメイン ソケットを介してコマンドをリッスンし、プロセスを強制終了します。子によってフォークされた B、スレッド 1 の A 子を強制終了したことを呼び出し元に応答します。
クライアントがソケットを閉じたときにプログラムをクラッシュさせたくないので、スレッド 2 の SIGPIPE を無視します。だから私はこれを使ってやってみました
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &set, NULL);
これを行うと、SIGPIPE をブロックするのに役立ちますが、スレッド 1 が子に SIGKILL を送信する機能もブロックします。
また、スレッドを作成する前にメイン関数で以下を使用してみました
signal(SIG_IGN, SIGPIPE);
ソケットに MSG_NOSIGNAL フラグを付けて送信します。
これは、SIGKILL を使用した私のシナリオにも役立ちません。上記のようなマルチスレッド状態で、フォークと実行、および送信された SIGKILL で SIGPIPE を安全に無視する方法はありますか?