Во-первых, если вы отправите SIGKILL
процессу (-ам), они никогда не увидят сигнал - они просто уничтожены ядром.
В противном случае, за 2.4.3 Действия с сигналом стандарта POSIX , вы можете извлечь PID процесса, который отправил сигнал, если ваш обработчик сигнала зарегистрирован в SA_SIGINFO
флаг:
Если для сигнала установлен флаг SA_SIGINFO
, то перехват сигнала
Функция должна быть введена как вызов функции языка C следующим образом:
void func(int signo, siginfo_t *info, void *context);
, где func
- указанная функция перехвата сигнала, signo
- это
номер сигнала доставляемого сигнала, а info
- указатель
к siginfo_t
структуре, определенной в <signal.h>
, содержащей по меньшей мере
следующие члены:
Member Type Member Name Description
int si_signo Signal number.
int si_code Cause of the signal.
pid_t si_pid Sending process ID.
uid_t si_uid Real user ID of sending process.
void * si_addr Address of faulting instruction.
int si_status Exit value or signal.
union sigval si_value Signal value.
Элемент si_signo
должен содержать номер сигнала. Это должно быть
такой же, как параметр signo
. si_code
член должен содержать
код, идентифицирующий причину сигнала. Следующие
не специфичные для сигнала значения определены для si_code
:
SI_USER
Сигнал был отправлен функцией kill()
. Реализация может установить si_code
на SI_USER
, если сигнал был отправлен raise()
или abort()
функций или любых подобных функций, предоставляемых как
расширения реализации. SI_QUEUE
Сигнал был отправлен функцией sigqueue()
. SI_TIMER
Сигнал был сгенерирован по истечении таймера, установленного timer_settime()
. SI_ASYNCIO
Сигнал был сгенерирован завершением запроса асинхронного ввода-вывода. SI_MESGQ
Сигнал сгенерирован поступлением сообщения в пустую очередь сообщений.
Определенные для сигнала значения для si_code
также определены, как описано в
<signal.h>
.
Это должно предоставить достаточно информации, чтобы сказать, был ли сигнал сгенерирован вызовом kill()
, какой процесс отправил сигнал, кто отправил сигнал. Или если сигнал был сгенерирован внутренней ошибкой, например, с помощью SIGSEGV
.