無視できるシグナルによって停止されないように保護したいサーバーアプリケーションがあります。シグナルを 1 つずつ設定せずに、考えられるすべてのシグナルを一度に無視する方法はありますか?
3 に答える
はい:
#include <signal.h>
sigset_t mask;
sigfillset(&mask);
sigprocmask(SIG_SETMASK, &mask, NULL);
これはシグナルを正確に無視するのではなく、ブロックします。これは実際には同じ効果です。
それについて言及する必要はないと思いますし、決してブロックしたり無視しSIGKILL
たりSIGSTOP
することはできません.
マスクの継承ルールなどの詳細なセマンティクスについては、man ページを確認してください。
シグナルをブロックすることは、シグナルを無視することと同じではありません。
C2H5OH の提案に従ってシグナルをブロックすると、保留中のシグナル キューに追加され、ブロックを解除するとすぐにプロセスに配信されます。
を使用してブロック解除を行うことができます
#include <signal.h>
sigset_t mask;
sigemptyset(&mask);
sigprocmask(SIG_SETMASK, &mask, NULL);
シグナルを無視する方法に関する質問に答えるには、シグナルがプロセスに配信されるたびに実行されるユーザー定義関数であるシグナルハンドラーによって処理する必要があります
static void foo (int bar)
{
/*some code here. In your case, nothing*/
}
次に、この関数を使用して登録します
signal(SIGINT,foo); //or whatever signal you want to ignore
すべてのシグナルを無視したい場合
int i;
for(i = 1; i <=31 ; i++)
{
signal(i,foo);
}
このコードは、プロセスに配信されたすべてのシグナルを受け取り、それらをブロックする代わりに無視します。
注: man ページによると、これは推奨される方法ではなく、代わりに sigaction が推奨されています。チェックアウトしてくださいman sigaction
に基づくソリューションは、私にとってはうまくsigprocmask()
いきpthread_sigmask()
ませんでした。これが私がうまくいったことです:
#include <signal.h>
#include <unistd.h>
#include <assert.h>
int main() {
struct sigaction act;
act.sa_handler = SIG_IGN;
for(int i = 1 ; i < 65 ; i++) {
printf("i = %d\n", i);
// 9 and 19 cannot be caught or ignored
// 32 and 33 do not exist
if((i != SIGKILL) && (i != SIGSTOP) && (i != 32) && (i != 33)) {
assert(sigaction(i, &act, NULL) == 0);
}
}
sleep(10000);
return 0;
}