Дифференцировать убийство на уровне uid (-1,…) от целевого убийства - PullRequest
2 голосов
/ 05 марта 2019

Если процесс выполняется kill(-1,SIGKILL); (или с другим сигналом), и вызов убивает вызывающего (MacOS kill(-1,...) делает это, хотя Linux оставляет вызывающего живым), но не его родитель (родительский имеет другой uid) Может ли родитель, используя средства, предоставляемые POSIX, сказать, умер ли вызывающий объект, потому что он убил себя с помощью вызова kill(-1,...) или потому, что другой процесс убил его?

1 Ответ

2 голосов
/ 05 марта 2019

Во-первых, если вы отправите 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.

...