2014-09-12 1 views
0

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

+0

Просто в начале! Я не знаю, как с этим бороться. –

+0

Сначала найдите источник ядра для функций, связанных с обработкой и доставкой сигналов. Затем прочитайте исходный код, пока не поймете, как он работает. Затем сделайте свою модификацию. – Peter

ответ

0

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

#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); 

Надеюсь, что поможет

+0

В ядре, как его реализовать? –

1

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

+0

Могу ли я изменить код ядра, связанный с обработчиком SIGKILL, и перекомпилировать ядро ​​для переопределения моего собственного? –

+0

уверен, что вы могли бы, но зачем вам это нужно? Чтобы процесс всегда работал? – tristan

+0

Ну, теперь я изучаю ядро, и я получил задание: переназначить действие SIGKILL для конкретного процесса. Например, когда я использую команду kill -9 PID, процесс PID woudl не будет убит. Тогда что мне делать? –