Создание демона с остановкой, запуск функциональности в C - PullRequest
9 голосов
/ 16 сентября 2010

Как добавить функцию остановки, запуска и отчета демона в этот код демона?

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>

int main(void) {

        /* Our process ID and Session ID */
        pid_t pid, sid;

        /* Fork off the parent process */
        pid = fork();
        if (pid < 0) {
                exit(EXIT_FAILURE);
        }
        /* If we got a good PID, then
           we can exit the parent process. */
        if (pid > 0) {
                exit(EXIT_SUCCESS);
        }

        /* Change the file mode mask */
        umask(0);

        /* Open any logs here */        

        /* Create a new SID for the child process */
        sid = setsid();
        if (sid < 0) {
                /* Log the failure */
                exit(EXIT_FAILURE);
        }



        /* Change the current working directory */
        if ((chdir("/")) < 0) {
                /* Log the failure */
                exit(EXIT_FAILURE);
        }

        /* Close out the standard file descriptors */
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);

        /* Daemon-specific initialization goes here */

        /* The Big Loop */
        while (1) {
           /* Do some task here ... */

           sleep(30); /* wait 30 seconds */
        }
   exit(EXIT_SUCCESS);
}

Ответы [ 2 ]

6 голосов
/ 16 сентября 2010
  1. Запишите pid демона в /var/run/mydaemonname.pid, чтобы вы могли позже легко найти его.
  2. Настройка обработчика сигналов для SIGUSR1 и SIGUSR2.
  3. Когдавы получаете SIGUSR1, переключаете флаг остановки.
  4. Когда вы получаете SIGUSR2, устанавливаете флаг отчета.
  5. В цикле while проверяйте каждый флаг.
  6. Если флаг остановкиустановлен, останавливайтесь до тех пор, пока он не будет очищен.
  7. Если установлен флаг отчета, снимите флажок и выполните отчет.

Существуют некоторые сложности в отношении остановки / запуска, но еслиЯ правильно понимаю вопрос, это должно привести вас к правильному пути.

Редактировать : Добавлен pid-файл, как предложено Dummy00001 в комментарии ниже.

5 голосов
/ 21 сентября 2010

Во-первых, вам, вероятно, не нужно так много раздувать и хранить себя: http://linux.die.net/man/3/daemon

Далее, помните, что интерфейс вашего демона в мире, вероятно, через какой-то сценарий оболочки, который вытакже напишите в /etc/init.d или в любом другом определенном дистрибутивом месте.

Так что для приведенного выше ответа ваш сценарий оболочки отправит эти сигналы в pid процесса.Хотя, вероятно, есть лучший способ.Сигнализация, как описано выше, является односторонним процессом, ваш управляющий скрипт должен перепрыгнуть через склонные к гонке условия и хрупкие обручи, чтобы подтвердить, успешно ли демон остановился или перезапустился.Я бы посмотрел приоритет и примеры в /etc/init.d.

...