Ya leí la página man de la familia de funciones pidfile. Pero realmente no lo entiendo ¿Cuál es el uso correcto? ¿Hay algún ejemplo más elaborado disponible? Creo que entiendo pidfile_open
. ¿Pero cuándo debo llamar al pidfile_write
y al prdfile_close
? ¿De qué proceso? ¿Padre o hijo? ¿Qué parámetros tengo que pasar a esas funciones? Creo que carezco de algunos fundamentos de * nix, supongo.¿Cómo usar la biblioteca de archivos pid correctamente?
Actualización:
Abajo puedes ver el ejemplo del hombre pidfile. ¿Por qué se bifurcan dos veces? ¿Por qué pidfile_close? Cuando llamo a pidfile_close, puedo iniciar otro daemon. ¿No es eso no deseado?
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 página de manual que está viendo tiene una sección de "ejemplo"? El BSD sí lo hace, lo que ilustra bastante bien el uso común. Consulte http://fuse4bsd.creo.hu/localcgi/man-cgi.cgi?pidfile+3, consulte la sección "ejemplo". –
@Tim, la página man contiene un ejemplo pero tengo problemas para aplicarlo a mi código daemon. Mi daemon está estructurado de manera diferente. Por ejemplo, no uso la función daemon (3). –