J'ai déjà lu la page man de la famille de fonctions pidfile. Mais je ne le comprends pas vraiment. Quelle est l'utilisation correcte? Y at-il un exemple plus élaboré disponible? Je pense que je comprends pidfile_open
. Mais quand dois-je appeler pidfile_write
et prdfile_close
? De quel processus? Parent ou enfant? Quels paramètres dois-je transmettre à ces fonctions? Il me semble que je manque de quelques principes fondamentaux.Comment utiliser la librairie pidfile correctement?
Mise à jour:
Ci-dessous vous voyez l'exemple de pidfile homme. Pourquoi fourchent-ils deux fois? Pourquoi pidfile_close? Quand j'appelle pidfile_close, je peux démarrer un autre démon. N'est-ce pas indésirable?
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);
La page de manuel que vous voyez a-t-elle une section "exemple"? Le BSD fait, ce qui illustre assez bien l'utilisation commune. Voir http://fuse4bsd.creo.hu/localcgi/man-cgi.cgi?pidfile+3, consultez la section "exemple". –
@Tim, la page man contient un exemple mais j'ai des problèmes pour l'appliquer à mon code démon. Mon démon est différemment structuré. Par exemple je n'utilise pas la fonction daemon (3). –