sigprocmask не работает - PullRequest
0 голосов
/ 26 мая 2010

Я использую 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 Ответ

1 голос
/ 26 мая 2010

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

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

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

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

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

...