Как правильно использовать библиотеку pidfile? - PullRequest
8 голосов
/ 14 сентября 2010

Я уже прочитал справочную страницу семейства функций pidfile. Но я не очень понимаю это. Как правильно использовать? Есть ли более сложный пример? Я думаю, что понимаю pidfile_open. Но когда я должен позвонить pidfile_write и prdfile_close? Из какого процесса? Родитель или ребенок? Какие параметры мне нужно передать этим функциям? Мне, вероятно, не хватает некоторых * основ nix, я думаю.

Обновление:

Ниже вы видите пример из pidfile man. Почему они разветвляются дважды? Почему pidfile_close? Когда я вызываю pidfile_close, я могу запустить другого демона. Разве это не нежелательно?

 struct pidfh *pfh;
 pid_t otherpid, childpid;

 pfh = pidfile_open("/var/run/daemon.pid", 0600, &otherpid);
 if (pfh == NULL) {
         if (errno == EEXIST) {
                 errx(EXIT_FAILURE, "Daemon already running, pid: %jd.",
                     (intmax_t)otherpid);
         }
         /* If we cannot create pidfile from other reasons, only warn. */
         warn("Cannot open or create pidfile");
 }

 if (daemon(0, 0) == -1) {
         warn("Cannot daemonize");
         pidfile_remove(pfh);
         exit(EXIT_FAILURE);
 }

 pidfile_write(pfh);

 for (;;) {
         /* Do work. */
         childpid = fork();
         switch (childpid) {
         case -1:
                 syslog(LOG_ERR, "Cannot fork(): %s.", strerror(errno));
                 break;
         case 0:
                 pidfile_close(pfh);
                 /* Do child work. */
                 break;
         default:
                 syslog(LOG_INFO, "Child %jd started.", (intmax_t)childpid);
                 break;
         }
 }

 pidfile_remove(pfh);
 exit(EXIT_SUCCESS);

Ответы [ 2 ]

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

Проблема заключается в том, что вы хотите выдать сообщение об ошибке до появления демона и что вам известен файл PID после запуска демона.

Таким образом, вы обычно делаете pidfile_open перед форком, что дает вам возможность выдать сообщение об ошибке. После того, как вы разветвились, вы знаете pidfile и можете выполнить pidfile_write.

1 голос
/ 26 октября 2013

Вы выполняете pidfile_open (3) перед переходом в фоновый режим, чтобы сразу же сообщать о любых проблемах.Вы пока не пишете PID, потому что ваш PID изменится после daemon (3).pidfile_open (3) блокирует только pidfile.После daemon (3) вы можете вызывать pidfile_write (3), так как теперь у вас есть окончательный PID (daemon (3) внутри).В основном процессе вы не можете вызвать pidfile_close (3), потому что в этом и заключается вся идея - сохраняя pidfile открытым и заблокированным, вы даете другим знать, что вы все еще живы.Вторая вилка совершенно необязательна.Это иллюстрирует обычное поведение, которое демоны порождают дочерние / рабочие процессы.Если вы не используете их, вам не нужен этот fork ().Этот fork () служит только для того, чтобы показать, что в таком рабочем процессе вы должны закрыть pid-файл, чтобы он оставался открытым и блокировался только основным процессом, а не дочерним.

...