Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
sigprocmask(SIG_SETMASK, &mask, NULL);
for(;;);
}
В функции start_daemon() заблокированы все сигналы, новые обработчики не определены. Функцию stop_daemon оставим без изменений.
Получаем исполняемый файл и определяем адрес функции stop_daemon:
# gcc -o sfc sfc.c
# objdump -x ./sfc | grep stop_daemon
08048434 g F .text 00000010 stop_daemon
Адрес функции stop_daemon равен 0x08048434. Этот адрес будет указан в качестве нового обработчика сигнала SIGUSR2 для процесса sfc.
Переопределение обработчика сигнала выполняет непосредственно модуль, вследствие чего функция инициализации модуля принимает следующий вид:
static int __init task_on(void)
{
struct task_struct *p;
Ищем структуру, соответствующую процессу sfc:
p = find_task_by_name("sfc");
if(p) printk(KERN_INFO "PID - %d ", p->pid);
else {
printk(KERN_INFO "No such task ");
return 0;
}
Устанавливаем адрес нового обработчика сигнала SIGURS2 – вписываем адрес функции stop_daemon в поле адреса обработчика sa_handler. Порядковый номер сигнала SIGUSR2 известен и равен 12 (см. <asm-i386/signal.h>):
(unsigned int)p->sig->action[11].sa.sa_handler = 0x8048434;
Если мы сейчас же пошлем сигнал процессу, то он его не воспримет. Почему? Дело в том, что все сигналы на данный момент заблокированы в функции start_daemon. Чтобы процесс воспринял приход сигнала SIGUSR2, нужно его разблокировать. Для этого необходимо сбросить соответствующий бит в маске заблокированных сигналов – в поле sigset_t blocked структуры task_struct:
sigdelset(p->blocked.sig, SIGUSR2);
А теперь посылаем сигнал SIGURS2 процессу:
sigaddset(&p->pending.signal, SIGUSR2);
p->sigpending = 1;
return 0;
}
Сброс бита в маске заблокированных сигналов выполняет функция sigdelset(), которая определена в файле <asm-i386/signal.h>:
static __inline__ void sigdelset(sigset_t *set, int _sig)
{
__asm__("btrl %1,%0" : "=m"(*set) : "Ir"(_sig - 1) : "cc");
}