Есть ли способ получить структуру siginfo_t
при обработке сигналов с помощью kqueue
? (В Linux при обработке сигнала с epoll
аналогичный struct signalfd_siginfo
получается простым чтением из signalfd
)
Получить siginfo_t при обработке сигналов с помощью kqueue
Ответы (1)
К сожалению, это невозможно.
Уведомление о доставке сигнала через kqueue
происходит после того, как сам процесс уже отреагировал на сигнал; т. е. они являются уведомлением после доставки, а не уведомлением о доставке.
Если процесс получает несколько сигналов между вызовами kevent
, то все, что делает система, — это агрегирует количество раз, когда сигнал был доставлен в поле data
структуры kevent
.
Это означает, что невозможно получить информацию о сигнале, так как к тому времени, когда вы вызвали kevent
данные, сигнал уже был доставлен в процесс, а детали сигнала были отброшены. Не существует внутреннего механизма, который хранил бы запись базовой информации о сигнале, которая могла бы быть доставлена kevent
.
Я читал какую-то большую книгу ранчо ботаников, которая, кажется, указывает на то, что обработка kqueue для сигналов не произойдет, если для процесса будет зарегистрирован обработчик. Это не похоже на поведение Yosemite, вы получаете событие для сигналов, даже если есть обработчик, зарегистрированный с использованием
sigaction
илиsignal
.