Где сигналы Linux отправляются или обрабатываются внутри ядра? - PullRequest
0 голосов
/ 13 июля 2011

Как обрабатывается механизм сигнализации (прерывания) в ядре? Причина, по которой я спрашиваю, такова: каким-то образом мое приложение получает сигнал SIGABRT, и я хочу выяснить, откуда это исходит ..

Ответы [ 2 ]

6 голосов
/ 13 июля 2011

Вы должны искать причину в своем приложении, а не в ядре.

Обычно процесс получает SIGABRT, когда он непосредственно вызывает abort или когда assert не удается.Поиск именно той части ядра, которая доставляет сигнал, ничего не даст.

В заключение, ваш код или библиотека, которую использует ваш код, является причиной этого.См. abort(3) и assert.

1 голос
/ 14 июля 2011

Ответ cnicutar - лучшее предположение ИМХО.

Возможно, что сигнал был отправлен другим процессом, хотя в случае SIGBART он, скорее всего, будет излучаться тем же процессом, который получает его черезabort(3) функция libc.

В случае сомнения вы можете запустить ваше приложение с помощью strace -e kill yourapp you args ..., чтобы быстро проверить, действительно ли этот системный вызов kill вызывается из вашей программы или зависимых библиотек.Или используйте gdb catch syscall.

Обратите внимание, что в некоторых случаях само ядро ​​может излучать сигналы, например SIGKILL, когда печально известный "убийца ООМ" вступает в действие.

Кстати,сигналы доставляются асинхронно, они нарушают нормальный рабочий процесс вашей программы.Вот почему их больно отследить.Помимо таких машин, как SystemTap, я не знаю, как отслеживать или регистрировать передачу и передачу сигналов в ядре.

...