Уловить, какой пользователь отправляет сигнал Kill

Пожалуйста, посетите эту ссылку:

Обычная практика состоит в том, чтобы запускать нижние шлемы или любую другую логику в обработчике IRQ только после проверки статуса IRQ из регистра, отображенного в памяти. Следовательно, проблема по умолчанию решается хорошим программистом.

2
18.12.2018, 18:24
2 ответа

Да, это возможно, хотя, возможно, и не из скрипта. Чтобы это работало, вам нужно настроить обработчик сигнала, используяsigactionс флагом SA_SIGINFO, и предоставить обработчику сигнатуру, идентичную

void handler(int sig, siginfo_t *info, void *ucontext)

Когда он вызывается для обработки сигнала, указатель siginfo_t, который он получает в качестве второго аргумента, будет содержать, среди прочего, идентификатор процесса-отправителя(info->si_pid)и прочитанный идентификатор пользователя процесса-отправителя. процесс отправки(info->si_uid). Они заполняются для сигналов, отправленных с использованиемkillили sigqueue.

Реализация этого на Python потребует значительного объема работы, поскольку сигнальный модуль не обеспечивает доступа к структуре siginfo_t.

3
27.01.2020, 21:55

bash + ctypes.sh

Просто для удовольствия, используя решение @StephenKitt, вот пример в bash с использованием подключаемого модуля bashctypes.sh (, который должен быть скомпилирован и установлен в /usr/localдля этого примера. ).

К сожалению, обе структуры sigactionи siginfo_tслишком сложны для работы встроенной команды structctypes.sh. Таким образом, эти структуры должны быть определены вручную. Это довольно раздражающая работа, и она не -переносима (как для ОС, так и для архитектуры ). В этом примере предполагается, что Linux >= 4.6 (из-заinfo->si_pkey)на архитектуре x86 _64.

#!/bin/bash

. /usr/local/bin/ctypes.sh || exit 2

handler () {
    local -a info=(int int int int uint32 uint32 int int64 int64 int64 int pointer int int pointer long int short pointer pointer int pointer int unsigned)
    unpack $3 info

    echo ''
    echo "handler($2, info={${info[@]}}, $4);"
    echo -- handling signal $2 --
    echo "info->si_pid=${info[4]}"
    echo "info->si_uid=${info[5]}"
    return
}
callback -n handler handler void int pointer pointer

SIGUSR2=12
SA_SIGINFO=4

act=(
    $handler
    long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0
    int:$SA_SIGINFO
    pointer:0
)
sizeof_act=$(( 8 + 16 * 8 + 4 + 8 ))

dlcall -n pact -r pointer malloc $sizeof_act
[ $pact != pointer:0 ] || exit 1
pack $pact act

dlcall -n ret -r int sigaction int:$SIGUSR2 $pact pointer:0
[ $ret = int:0 ] || exit 1

echo "sigaction(SIGUSR2, act={${act[@]}}, NULL) = $ret"

echo ''
echo run this: kill -$SIGUSR2 $$
sleep 99

Исполнение:

терм1:

$./siginfo.bash 
sigaction(SIGUSR2, act={pointer:0x7ff26f0d3010 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 long:0 int:4 pointer:0}, NULL) = int:0

run this: kill -12 24250

терм2:

$ echo $$
21864
$ id -u
1000
$ kill -12 24250
$ 

результат в терм1:

handler(int:12, info={int:12 int:0 int:0 int:0 uint32:21864 uint32:1000 int:0 int64:0 int64:0 int64:0 int:0 pointer:0 int:0 int:0 pointer:0 long:0 int:0 short:0 pointer:0 pointer:0 int:0 pointer:0 int:0 unsigned:0}, pointer:0x7fff4583a500);
-- handling signal int:12 --
info->si_pid=uint32:21864
info->si_uid=uint32:1000
3
27.01.2020, 21:55

Теги

Похожие вопросы