13

無視できるシグナルによって停止されないように保護したいサーバーアプリケーションがあります。シグナルを 1 つずつ設定せずに、考えられるすべてのシグナルを一度に無視する方法はありますか?

4

3 に答える 3

16

はい:

#include <signal.h>

sigset_t mask;
sigfillset(&mask);
sigprocmask(SIG_SETMASK, &mask, NULL);

これはシグナルを正確に無視するのではなく、ブロックします。これは実際には同じ効果です。

それについて言及する必要はないと思いますし、決してブロックしたり無視しSIGKILLたりSIGSTOPすることはできません.

マスクの継承ルールなどの詳細なセマンティクスについては、man ページを確認してください。

于 2012-04-06T17:30:47.480 に答える
14

シグナルをブロックすることは、シグナルを無視することと同じではありません。

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

于 2014-08-27T12:14:37.893 に答える
5

に基づくソリューションは、私にとってはうまく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;
}
于 2015-04-03T14:36:08.300 に答える