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 */