Как правильно использовать библиотеку pidfile?
Я уже прочитал справочную страницу семейства функций pidfile. Но я этого не понимаю. Каково правильное использование? Есть ли более подробный пример? Кажется, я понимаю!--1-->. Но когда я должен позвонить pidfile_write
и prdfile_close
? Из какого процесса? Родитель или ребенок? Какие параметры я должен передать этим функциям? Мне, наверное, не хватает некоторых основ *nix.
обновление:
ниже вы видите пример из man pidfile. Почему они раздваиваются? дважды? Почему 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 ответов
проблема в том, что вы хотите дать сообщение об ошибке до появления демона, и что вы знаете файл PID после появления демона.
таким образом, вы обычно делаете pidfile_open перед вилкой, что дает вам возможность дать сообщение об ошибке. После того, как вы раздвоили, вы знаете pidfile, и вы можете сделать pidfile_write.
вы делаете pidfile_open (3), прежде чем перейти в фоновый режим, поэтому вы можете сразу сообщить о любых проблемах. Вы еще не пишете PID, потому что ваш PID изменится после daemon(3). pidfile_open (3) блокирует только pidfile. После daemon (3) Вы можете вызвать pidfile_write(3), поскольку теперь у вас есть окончательный PID (daemon(3) forks внутренне). В основном процессе вы не можете вызвать pidfile_close(3), потому что в этом вся идея - сохраняя pidfile открытым и заблокированным, вы позволяете другим знать, что вы все еще жив. Вторая вилка полностью необязательна. Он иллюстрирует общее поведение, которое демоны порождают дочерние / рабочие процессы. Если вы не используете их, вам не нужна эта вилка(). Эта fork () существует только для того, чтобы показать, что в таком рабочем процессе вы должны закрыть pidfile, поэтому он остается открытым и заблокированным только основным процессом, а не дочерним.