Запись журнала отладки демона - PullRequest
0 голосов
/ 22 февраля 2011

Итак, я начинаю заниматься программированием на ОС / процессах и тому подобным, я новичок в этом, но я в основном понял, (моя книга об ОС для колледжа была бесполезна, поэтому мне пришлось просматривать всемирную паутину .... даЯ просто назвал это так)

В любом случае, вот мой скелет процесса демона ... Это в основном не мое, в основном это кусочки и кусочки, взятые при просмотре кода в книгах (верно?)

В любом случае у меня было несколько вопросов относительно идентификатора сеанса (что это такое? И чем он отличается от идентификатора процесса)

и 2, как мне вести запись файлов отладки?в разделе ниже?Потому что это не в цикле демона?мы бы просто вернули что-то вроде «Демон запущен: 11:59 утра» и т. д.?

3, почему именно мы меняем каталоги?и почему вы хотите, чтобы он был пользователем root .... Очевидно, я не программист x-pert linux, но все же ....

Думаю, я не понимаю, как это делает его демоном?Я понимаю, что вилки и родители / дети ..... но что делает этого демона?

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

int main(void) {
        //Process and Session ID 
        pid_t pid, sid;

        //Fork
        pid = fork();
        if (pid < 0) {
                exit(EXIT_FAILURE);
        }
        //Huzzah
        if (pid > 0) {
                exit(EXIT_SUCCESS);
        }

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

       /* APPARENTLY I PLACE LOGFILES HERE? HOW? */       

        //Create new sid (i don't understand this
        sid = setsid();
        if (sid < 0) {
                exit(EXIT_FAILURE);
        }



        //Change Directory, Why?
        if ((chdir("/")) < 0) {
                exit(EXIT_FAILURE);
        }

        /* Close out the standard file descriptors <---Why? just for protection */
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);

        /* Daemon-specific initialization goes here */

        //Daemon Loop
        while (1) {
          //Do Task
        }
   exit(EXIT_SUCCESS);
}

edit: Забыл упомянуть, что это для Linux

1 Ответ

1 голос
/ 22 февраля 2011

Последний вопрос первый: нет строгого определения того, что квалифицирует процесс как демон, кроме того, что он выполняется в фоновом режиме и без контроля со стороны пользователя. Но у демонов обычно есть ряд характеристик, некоторые из которых вы уловили. - простая английская отправная точка.

Группы процессов и сессии являются темой для них самих. Это - достаточно приличная точка отсчета.

Я не знаю точно, что вы получаете с вопросом файла журнала. Поскольку демоны отсоединяются от терминала, stdin / out / err перенаправляются или закрываются. Это оставляет проблему того, куда отправлять вывод, в этом случае сообщения об ошибках. Средства системного журнала (или аналогичные) обычно используются, но ничто не мешает вам использовать любой старый файл по вашему выбору. Возможно, вы захотите открыть их вне цикла событий, но в этом нет ничего волшебного - просто напишите им.

Рабочий каталог изменен, потому что вы никогда не знаете, каким будет начальный каталог при запуске программы. Это может быть сетевой диск (или любой другой), который может быть отключен, пока ваш (долго работающий) демон все еще работает. Вы можете изменить каталог на любой, какой захотите, но обычно используется root, потому что если корневой каталог исчезает хорошо ...

Если вы серьезно относитесь к этому материалу, тогда получите хорошую книгу Stevens , вероятно, начинающуюся с APUE . Они дорогие, но одни из лучших инвестиций в жизни.

...