Демон (англ. daemon) — в багатозадачних операційних системах, таких, як UNIX — програма, яка працює у фоновому режимі без прямого спілкування з користувачем.
Демони зазвичай запускаються під час завантаження системи, і виконуються від імені користувача root, або ж окремого користувача, створеного спеціально для даного демона (наприклад, apache). Типові завдання демонів: сервери мережевих протоколів (HTTP, FTP, електронна пошта та інші), управління устаткуванням, підтримка черг друку, управління виконанням за розкладом і подібні завдання. Назви таких програм, зазвичай, закінчуються на «d» для підкреслення того що ця програма є демоном, наприклад: sshd, syslogd, httpd та інші.
До демона пред'являються дві загальних вимоги:
1. Він повинен виконуватись, як нащадок процесу ініціалізації;
2. Він не повинен бути з'єднаним із терміналом.
Загалом, для створення демона необхідно виконати наступні кроки:
1. За допомогою функції fork() створити новий процес, який пізніше буде перетворено у демон;
2. Завершити роботу батьківського процесу шляхом виклику функції exit();
3. Виконується функція setsid(), щоб задати демону нову групу процесів та сеанс;
4. Робочий каталог змінюється за допомогою функції chdir();
5. Закриваються усі файлові дескриптори;
6. Відкриваються файлові дескриптори 0, 1 та 2 (стандартний ввід, стандартний вивід та стандартний вивід для помилок), з їхнім перенаправленням у /dev/null.
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <linux/limits.h>
int main(void)
{
/* ID нашого процесу */
pid_t pid, sid;
/* Форкаємо процес */
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
/* Завершуємо батьківський процес */
if (pid > 0) {
exit(EXIT_SUCCESS);
}
/* Змінюємо umask */
umask(0);
/* Створюємо новий SID для процесу-нащадка */
sid = setsid();
if (sid < 0) {
exit(EXIT_FAILURE);
}
/* Змінюємо поточну директорію */
if ((chdir("/")) < 0) {
exit(EXIT_FAILURE);
}
/* Закриваємо дескриптори усіх відкритих файлів */
for (int i = 0; i < NR_OPEN; i++) {
close(i);
}
/* Перенаправляємо дескриптори файлів 0, 1 та 2 в /dev/null */
open("/dev/null", O_RDWR);
dup(0);
dup(0);
/*
Специфічний для даного демона код...
*/
return 0;
}
Коментарі (15)
RSS згорнути / розгорнутиarcher
Маєте +1 за уважність та інтерес! :)
sashko
треба якось спробувати
Syancya
sashko
archer
та й варта було б на першоджерело послатись :) «Linux system programming» by Robert Love
archer
sashko
archer
# man 2 dup
Перепрошую за прямоту, та після Ваших дитячих насмішок дозволю собі її проявити — я б на Вашому місці помер від сорому, якби мені хтось вказав на те, що я не знаю про мани :(
Cheers! :)
sashko
ти б дійсно краще детальніше прокоментувавти останніх 3 строки коду, ніж пояснення для chdir чи close в циклі.
archer
sashko
man ulimit
man sysctl.conf
:D
archer
І прохання на майбутнє — наступного разу або коментарі по темі, або просто ставите мінус, і пишете: «афтар мудаг», бо надалі розважати Вас, приділяючи увагу, якої Вам, схоже сильно бракує, я наміру не маю. Пишіть свої пости по linux development специфічним темах, їх «розробці» бракує.
Цінуймося! І без образ, просто я ненавиджу тролів!
sashko
archer
archer
Тільки зареєстровані й авторизовані користувачі можуть залишати коментарі.