Получить siginfo_t при обработке сигналов с помощью kqueue

Есть ли способ получить структуру siginfo_t при обработке сигналов с помощью kqueue? (В Linux при обработке сигнала с epoll аналогичный struct signalfd_siginfo получается простым чтением из signalfd)


person Vlad Buslov    schedule 07.01.2015    source источник


Ответы (1)


К сожалению, это невозможно.

Уведомление о доставке сигнала через kqueue происходит после того, как сам процесс уже отреагировал на сигнал; т. е. они являются уведомлением после доставки, а не уведомлением о доставке.

Если процесс получает несколько сигналов между вызовами kevent, то все, что делает система, — это агрегирует количество раз, когда сигнал был доставлен в поле data структуры kevent.

Это означает, что невозможно получить информацию о сигнале, так как к тому времени, когда вы вызвали kevent данные, сигнал уже был доставлен в процесс, а детали сигнала были отброшены. Не существует внутреннего механизма, который хранил бы запись базовой информации о сигнале, которая могла бы быть доставлена ​​kevent.

Я читал какую-то большую книгу ранчо ботаников, которая, кажется, указывает на то, что обработка kqueue для сигналов не произойдет, если для процесса будет зарегистрирован обработчик. Это не похоже на поведение Yosemite, вы получаете событие для сигналов, даже если есть обработчик, зарегистрированный с использованием sigaction или signal.

person Petesh    schedule 07.01.2015