Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
for(;;);
}
Новый обработчик сигнала SIGUSR1 просто завершит выполнение демона, вызвав функцию exit:
void stop_daemon()
{
exit(0);
}
Получаем исполняемый файл и запускаем его на выполнение:
# gcc -o sfc sfc.c
# ./sfc
Процесс начинает свое выполнение в фоновом режиме. Найдем его в списке процессов:
# ps -ax | grep sfc
903 ? R 0:02 ./sfc
Итак, процесс ./sfc успешно выполняется, и его PID равен 903.
Теперь приступим к реализации модуля ядра.
/* Файл task.c */
#include <linux/config.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/types.h>
#include <linux/signal.h>
Первое, что должен сделать модуль после загрузки, – найти в списке структур struct task_struct структуру, соответствующую процессу sfc. Поиск выполняется при помощи функции find_task_by_name(). Аргументом функции является имя искомого процесса, возвращаемое значение – указатель на структуру процесса struct task_ struct.
Функция find_task_by_name выглядит следующим образом:
struct task_struct * find_task_by_name(__u8 *name)
{
struct task_struct *p;
for_each_task(p)
if(strcmp(p->comm, name) == 0) return p;
return 0;
}
Для прохождения всего списка процессов в системе предусмотрен макрос for_each_task(p) (см. файл <linux/sched.h>):
#define for_each_task(p) for (p = &init_task ; (p = p->next_task) != &init_task ; )
Функция find_task_by_name будет вызвана во время процедуры инициализации модуля:
static int __init task_on(void)
{
struct task_struct *p;
int pid = 0;
int i;