Из спецификации POSIX , sigprocmask()
возвращает -1 и устанавливает errno соответственно, если это не удается. Если код, который вы опубликовали, - это код, который вы используете, вы, очевидно, не проверяете, удалось ли это.
Если sigprocmask()
успешно и действительно SIGALRM
прерывает функцию, вызывающую mask()
, существует очень хороший шанс, что что-то в этой функции обрабатывает этот сигнал по-разному.
Другая вещь, которую вы можете сделать, это raise(SIGALRM)
сразу после вызова mask()
, если она игнорируется, то какая-то другая функция, которая ниже, меняет поведение.
Как отметили bmargulies в комментариях (это, вероятно, должно было быть ответом), вы можете использовать strace
, чтобы увидеть, так ли это на самом деле, в сочетании с ltrace
, если применимо, чтобы посмотреть его через библиотечные звонки.
Это не редкость, когда вы работаете с библиотеками, которые грубы, когда дело доходит до установки обработчиков (например, проверка, игнорируется ли сигнал или обрабатывается где-либо еще до изменения поведения).