Создание демона.
Security-Enhanced Linux — линукс с улучшенной безопасностью
Чтобы сигналы не поступали в программу, можно указать, что они должны игнорироваться или блокироваться. Игнорируемый сигнал просто пропускается и не оказывает на процесс никакого влияния. Блокируемый сигнал ставится в очередь на обработку, но ядро не требует от процесса никаких действий до явного разблокирования сигнала. Обработчик вызывается для разблокированного сигнала только один раз, даже… Читать ещё >
Создание демона. Security-Enhanced Linux — линукс с улучшенной безопасностью (реферат, курсовая, диплом, контрольная)
Демон — это консольное приложение, т.к. он работает в неинтерактивном режиме и графическая оболочка ему не нужна.
Создание демона можно логически разделить на три части:
Создание процесса с помощью fork ();
Отрыв от управляющего терминала;
Обработка сигналов или событий (совершение так называемой полезной работы) Системный вызов fork создает новый процесс. Возвращает идентификатор дочернего процесса или 0 в случае успеха и -1 в случае ошибки (код ошибки — в переменной errno).
На языке Си создание нового процесса будет выглядеть так:
int pid = fork();
if(pid = = -1) // fork failed.
{perror(«Невозможно создать процесс!»);
exit(1);}.
else.
{if(pid 0) exit(0); // parent process exits}.
Возвращаемое значение -1 свидетельствует об ошибке, но поскольку fork не имеет входных аргументов, то ошибочная ситуация никак не связана с вызывающим процессом. Единственная возможная ошибка — исчерпывание системных ресурсов, то есть либо нехватка места в файле подкачки, либо в системе исполняется слишком много процессов.
Т.к. по завершению fork оба процесса (потомок и предок) получают от него возвращаемое значение, а нам интересен потомок, то строкой «if (pid 0) then exit (0);» мы завершаем процесс предок (процесс-потомок получает от fork значение 0, родительский процесс — идентификатор процесса-потомка), в то время как дочерний процесс продолжает выполняться.
После завершения родительского процесса контроль над терминалом возвращается запустившей его программе (оболочке), а новый процесс, созданный функцией fork, выполняется в фоновом режиме. Однако наш процесс все еще принадлежит той же группе, что и создавший его процесс. Для того чтобы демон стал полностью независим от запустившего его терминала, новый процесс следует поместить в новую группу, а самый простой способ сделать это — создать новую сессию.
Новая сессия создается вызовом функции setsid:
pid = setsid();
if(pid = = -1) // setsid failed.
{perror(«Невозможно создать новую сессию»);
exit(1);}.
Теперь процесс выполняется в режиме демона.
Демон обычно несет на себе какие-либо полезные функции (например, демон диспетчера печати обрабатывает задания, отправленные на печатающее устройство), иначе его создание было бы лишено смысла.
В связи с этим было решено написать свой обработчик сигналов.
Сигналы — это запросы на прерывание на уровне процессов. В UNIX определено свыше тридцати различных сигналов. Когда поступает сигнал, возможен один из двух вариантов развития событий. Если процесс назначил данному сигналу подпрограмму обработки, то она вызывается, и ей предоставляется информация о контексте, в которой был сгенерирован сигнал. В противном случае ядро выполняет от имени процесса действия, определенные по умолчанию. Эти действия различны для разных сигналов.
Процесс вызова обработчика называют перехватом сигнала. Когда выполнение обработчика завершается, процесс возобновляется с той точки, где был получен сигнал.
Чтобы сигналы не поступали в программу, можно указать, что они должны игнорироваться или блокироваться. Игнорируемый сигнал просто пропускается и не оказывает на процесс никакого влияния. Блокируемый сигнал ставится в очередь на обработку, но ядро не требует от процесса никаких действий до явного разблокирования сигнала. Обработчик вызывается для разблокированного сигнала только один раз, даже если в течение периода блокировки поступило несколько таких сигналов.
В данной работе демон обрабатывает только сигналы SIGUSR1, SIGUSR2, SIGTERM, SIGINT, SIGQUIT. Остальные сигналы игнорируются, ну кроме сигнала SIGKILL (данный сигнал не может блокироваться и приводит к безусловному завершению процесса на уровне операционной системы).
Сигналы SIGUSR1 и SIGUSR2 не имеют стандартного назначения. Ими можно пользоваться в различных ситуациях.
При получении сигнала SIGUSR1 демон выводит на терминал информацию о программе, при получении SIGUSR2 — системную информацию (PID, PPID, UID, GID).
Все полученные сигналы протоколируется в файл с указанием времени получения сигнала.