какие правильные значения присваивать полю sa_mask структуры sigaction

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void sigint_handler(int sig) {
  write(0, "nice try\n", 10);
}
int main(void) {
  struct sigaction sa; // configure sigaction
  sa.sa_handler=sigint_handler;
  sa.sa_flags=0;
  sa.sa_mask=0;
  if (sigaction(SIGINT, & sa, NULL) == -1) { // set handler
    perror("sigaction");
    exit(1);
  }
  printf("You shall not exit!\n");
  while (1) {
    sleep(1);
  }
}

Приведенный выше код при компиляции с помощью g++ дает ошибку:

sigaction.c:13:14: error: no match for ‘operator=’ (operand types are ‘__sigset_t’ and
 ‘int’)
   13 |   sa.sa_mask=0;
      |              ^
In file included from /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h:4,
                 from /usr/include/x86_64-linux-gnu/sys/select.h:33,
                 from /usr/include/x86_64-linux-gnu/sys/types.h:179,
                 from /usr/include/stdlib.h:394,
                 from /usr/include/c++/9/cstdlib:75,
                 from /usr/include/c++/9/stdlib.h:36,
                 from sigaction.c:2:

В man-страницах для sigaction он определен как sigset_t sa_mask; Я не уверен, что это за sigset_t. Какие могут быть возможные значения для него.


person asha rani    schedule 09.12.2020    source источник
comment
Поле sa_mask определяет набор сигналов, которые не должны прерывать ваш обработчик сигналов. Вам нужно использовать функции sigaddset, sigdelset, sigemptyset и sigfillset для управления полем. См. дубликаты и sigsetops справочную страницу.   -  person zwol    schedule 09.12.2020
comment
Сообщение об ошибке (особенно часть о operator=) указывает на то, что вы программируете на C++, а не на C. Как и использование g++ вместо gcc для сборки. Пожалуйста, обратите внимание на теги, которые вы выбираете при написании вопросов. С другой стороны, в показанном коде нет ничего специфичного для C++, что, возможно, означает, что вы создали неправильный тип проекта в своей среде IDE или иным образом добавили флаги для явной сборки как C++, потому что даже g++ создаст .c файл как C .   -  person Some programmer dude    schedule 09.12.2020