Вопрос

Я использую 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 Если применимо, чтобы посмотреть его, шаг через библиотечные звонки.

Это совсем не редкость, когда вы работаете с библиотеками, которые грубыются, когда речь идет о установке обработчиков (например, проверка, если сигнал игнорируется, или обрабатывается в другом месте до модификации поведения).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top