sigprocmask не работает

Я использую sigprocmask следующим образом:

void mask(){
    sigset_t new_set,old_set;
    sigemptyset(&new_set);
    sigaddset(&new_set,SIGALRM);
    sigprocmask(SIG_BLOCK, &new_set, &old_set);
}

и, к моему удивлению, функция, которая печатает большой список, каким-то образом прерывается сигналом, хотя я вызываю mask() в его начале. Похоже, что маска не работает, так как моя функция не вызывает никаких других функций и, следовательно, нигде в ее выполнении не произойдет unmask(). Что может привести к сбою sigprocmask?

1 ответ

Решение

Из спецификации POSIX, sigprocmask() возвращает -1 и устанавливает errno соответственно, если это не удается. Если код, который вы опубликовали, является кодом, который вы используете, вы, очевидно, не проверяете, удалось ли это.

Если sigprocmask() успешно, и это действительно SIGALRM что прерывает функцию, которая вызывает mask()очень велика вероятность того, что что-то в этой функции обрабатывает этот сигнал по-другому.

Другая вещь, которую вы можете сделать, это raise(SIGALRM) сразу после звонка mask()Если его игнорировать, то какая-то другая функция, которая ниже, меняет поведение.

Как отмечено в комментариях bmargulies (это, вероятно, должно было быть ответом), вы можете использовать strace чтобы увидеть, если это действительно так, в сочетании с ltrace если это применимо, чтобы посмотреть его шаг за шагом библиотечные вызовы.

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

Другие вопросы по тегам