Вопрос
Я использую SigProcmask следующим образом:
void mask(){
sigset_t new_set,old_set;
sigemptyset(&new_set);
sigaddset(&new_set,SIGALRM);
sigprocmask(SIG_BLOCK, &new_set, &old_set);
}
И к моему удивлению функция, которая печатает большой список, как-то прерывается сигналом, даже если я вызываю маску () в его начале. Похоже, что маска не удается, поскольку моя функция не вызывает любые другие функции и, следовательно, нигде в его запуске не должно быть неразрешенной (). Что может вызвать потерпеть неудачу SigProcmask?
Решение
Из Posix Spec., sigprocmask()
Возвращает -1 и наклонительно устанавливает errno, если он не удается. Если код, который вы опубликовали, это код, который вы используете, вы, очевидно, не проверяете, это удается ли он.
Если sigprocmask()
успешно, и это действительно SIGALRM
это прерывает функцию, которая вызывает mask()
, Eсть очень Хорошо вероятность того, что что-то в этой функции обрабатывает этот сигнал по-разному.
Другая вещь, которую вы можете сделать, это raise(SIGALRM)
сразу после звонка mask()
, Если его игнорируют, то какая-то другая функция ниже, которая меняется поведение.
Так как Bmargulies. Отмечено в комментариях (что, вероятно, должно быть ответом), вы можете использовать strace
чтобы увидеть, действительно ли это, в сочетании с ltrace
Если применимо, чтобы посмотреть его, шаг через библиотечные звонки.
Это совсем не редкость, когда вы работаете с библиотеками, которые грубыются, когда речь идет о установке обработчиков (например, проверка, если сигнал игнорируется, или обрабатывается в другом месте до модификации поведения).