могу ли я изменить код обработчика сигнала SIGKILL

Как мне изменить код обработчика сигналов SIGKILL, чтобы я мог переопределить ацитин SIGKILL?


person Xiliang Song    schedule 12.09.2014    source источник
comment
Только в начале! Я не знаю, как с этим справиться.   -  person Xiliang Song    schedule 12.09.2014
comment
Во-первых, найдите в исходниках ядра функции, связанные с обработкой и доставкой сигналов. Затем читайте исходный код, пока не поймете, как он работает. Затем сделайте свою модификацию.   -  person Peter    schedule 12.09.2014


Ответы (2)


Вы не можете.
Сигналы SIGKILL и SIGSTOP нельзя перехватить, заблокировать или проигнорировать. Подробнее читайте здесь

person tristan    schedule 12.09.2014
comment
Могу ли я изменить код ядра, связанный с обработчиком SIGKILL, и перекомпилировать ядро, чтобы переопределить мою собственную функцию? - person Xiliang Song; 12.09.2014
comment
конечно можно, но зачем тебе это? Чтобы процесс всегда работал? - person tristan; 12.09.2014
comment
Ну вот сейчас изучаю ядро ​​и получил задание: переопределить действие SIGKILL для конкретного процесса. Например, когда я использую команду kill -9 PID, процесс PID не будет уничтожен. Тогда что мне делать? - person Xiliang Song; 12.09.2014
comment
вам нужно отредактировать свой вопрос и добавить тег [домашнее задание]. Я не кодер ядра, но я думаю, вам нужно изменить код доставки сигнала, а не только код обработки сигнала. - person tristan; 12.09.2014
comment
Я понял! Благодарю вас! - person Xiliang Song; 12.09.2014
comment
Ну, я делаю это! Спасибо! - person Xiliang Song; 12.09.2014

Вам нужно определить функцию для обработки, когда происходят исключения:

#include <stdio.h>
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>

void ExceptionHandler(int sig)
{
    #define MAXSTACKSIZE (16)
    void *stackTraces[MAXSTACKSIZE];
    size_t size;

    // get void*'s for all entries on the stack
    size = backtrace(stackTraces, MAXSTACKSIZE);

    // do other stuffs of your own

    exit(1);
}

Затем в своем основном коде зарегистрируйте эту функцию (вы также можете зарегистрироваться с другими типами исключений):

signal(SIGSEGV, ExceptionHandler);
signal(SIGTERM, ExceptionHandler);
signal(SIGINT, ExceptionHandler);
signal(SIGILL, ExceptionHandler);
signal(SIGABRT, ExceptionHandler);
signal(SIGFPE, ExceptionHandler);

надеюсь, это поможет

person ivzeus    schedule 12.09.2014
comment
В ядре, как это реализовать? - person Xiliang Song; 12.09.2014