Как создать демона в linux

Демон — это программа не имеющая стандартного ввода и вывода, и при этом работающая в фоновом режиме.

Исходный код простейшего демона:

int main() {
  int pid = fork();
  switch(  pid ) {
  case 0:
    setsid();
    chdir("/");
    close(stdin);
    close(stdout);
    close(stderr);
    mainloop();
    exit(0);
  case -1:
    printf("Fail: unable to fork\n");
    break;
  default:
   printf("OK: demon with pid %d is created\n", pid);
   break;
 }
 return 0;
}

Рассмотрим подробнее

В первую очередь вызывается функция fork, которая создает копию процесса. В родительском-процессе функция вернет PID порожденного дочернего процесса, а в дочернем процессе fork вернет 0.

Вызов setsid создает новую сессию. Создание новой сессии обеспечит нас  следующими преимуществами: процесс становится лидером новой сессии, процесс становится лидером новой группы процессов и у процесса нет управляющего терминала.

chdir(«/») изменяет текущий каталог процесса на корневой,  что бы освободить  файловую систему с которой был запущен демон.

Ну и вызов close(stdin), close(stdout), close(stderr) закрывают файловые дескрипторы стандартного ввода и вывода.

Реализация  функции mainloop зависит от от назначения демона, поэтому код этой функции здесь не приведен.

Запись опубликована в рубрике Великий и могучий Си с метками , . Добавьте в закладки постоянную ссылку.

8 комментариев: Как создать демона в linux

  1. Александр говорит:

    Скажите пож. как мне чтобы каждые 5 минут на сервере выполнялась проверка, существует ли процесс ts3server_linux и если его не существует, то выполнялась бы команда
    /home/teamspeak3-server_linux-x86/ts3server_startscript.sh start
    от имени пользователя tssrv

  2. Артём Двинин говорит:

    Можно написать скрипт, который проверяет запущен ли процесс (например так: ps -C ts3server_linux || /home/teamspeak3-server_linux-x86/ts3server_startscript.sh start ). И прописать запуск этого скрипта в crontab.

    А еще посоветую посмотреть в сторону специально заточенных для этих целей утилит, daemontools или runit.

    Если нужна более подробная информация — пишите, может смогу помочь.

  3. Денис говорит:

    Куда будет писать функция:
    printf(«Fail: unable to fork\n»);
    если мы закрыли stdout?

  4. Денис говорит:

    Затупил… Закрыли мы для дочернего процесса, а вывод для родителя

  5. Maxim говорит:

    «Демоны проклятые…» :) В Windows — сервис. Почему в Linux — демоны?

  6. Артём Двинин говорит:

    Чёрная магия :) Работа программиста и шамана имеет много общего — оба бормочут непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает…

  7. Bruno говорит:


    void demon(void)
    { time_t rawtime;
    while(1)
    { time(&rawtime);
    printf("The current date/time is: %s",ctime(&rawtime));
    sleep(20);
    }
    }

    {
    setsid();
    chdir("/");
    fclose(stdin);
    //оставим вывод в консоль наш демон будет периодически выводить дату и время
    // fclose(stdout);
    fclose(stderr);
    demon();
    }

  8. SERGEY говорит:

    как создать демон для эл почты почта уже создана

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>