Unix sigset_t с использованием sigprocmask()

Я пытаюсь напечатать sigset используя printf. В этой программе я использовал sigprocmask для блокировки SIGHUP и SIGTERM. После инициализации set и oset для пустых множеств, они дают несколько случайных шестнадцатеричных строк в качестве вывода. Как мне решить эту проблему??

Кроме того, у меня есть сомнения относительно ожидаемого результата этой программы, если я нажму Ctrl-C после выполнения. Функция улавливателя также наследует текущий набор сигналов и должна печатать так же, как набор?

#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<bits/sigset.h>
void catcher(int sig){
        sigset_t set;
        sigprocmask(SIG_SETMASK, NULL, &set);
        printf("%x inside function\n",set);
}
int main()
{
        sigset_t set,oset;
        signal(SIGINT,catcher);
        sigemptyset(&set);
        sigemptyset(&oset);
        printf("%x\n",oset);
        printf("%x\n",set);
        sigaddset(&set,SIGHUP);
        sigaddset(&set,SIGTERM);
        sigprocmask(SIG_SETMASK,NULL,&oset);
        printf("%x\n",oset);
        printf("%x\n",set); 
        sigprocmask(SIG_BLOCK,&set,&oset);
        pause();
        sigprocmask(SIG_SETMASK,&oset,&set);
        printf("%x\n",set);
}

1 ответ

Руководство говорит:

Функция sigprocmask() проверяет и / или изменяет текущую маску сигналов (те сигналы, которые заблокированы от доставки). Сигналы блокируются, если они являются членами текущего набора маски сигналов.

Эта маска предназначена для всего процесса и используется для блокировки некоторых сигналов для доставки. Здесь нет наследства. Существует маска, описывающая в каждой точке выполнения набор заблокированных сигналов.

Вы должны знать, что по умолчанию при захвате сигнала он автоматически добавляется к набору заблокированных сигналов (чтобы предотвратить повторный вход в процедуру отлова) и удаляется в конце.

Выполнение вашего кода на моей машине дает:

0            // empty set
0            // empty oset
0            // empty oset
4001         // set = { HUP, TERM }
^C4003       // in catcher, signal is automatically blocked set={HUP, INT, TERM}
4001         // after catcher back in old state set={HUP,TERM}

Это означает, что биты 0 и 14 используются для SIGHUP а также SIGTERMи бит 1 для SIGINTЭто именно то, что я нашел в моем системном заголовочном файле:

#define SIGHUP  1       /* hangup */
#define SIGINT  2       /* interrupt */
#define SIGTERM 15      /* software termination signal from kill */
Другие вопросы по тегам