Przeczytałem już stronę podręcznika dla rodziny funkcji pidfile. Ale tak naprawdę nie rozumiem tego. Jakie jest prawidłowe użycie? Czy jest dostępny bardziej rozbudowany przykład? Myślę, że rozumiem pidfile_open
. Ale kiedy powinienem zadzwonić pod numer pidfile_write
i prdfile_close
? Z którego procesu? Rodzic czy dziecko? Jakie parametry muszę przekazać do tych funkcji? Prawdopodobnie brakuje mi pewnej podstawki * nix.Jak poprawnie korzystać z biblioteki pidfile?
Aktualizacja:
Poniżej można zobaczyć przykład od człowieka pliki pid. Dlaczego się rozwidlają dwa razy? Dlaczego pidfile_close? Kiedy wołam pidfile_close mogę uruchomić innego demona. Czy to nie jest niechciane?
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);
Czy strona podręcznika ma sekcję "przykład"? Jest to BSD, co dość dobrze ilustruje powszechne użycie. Zobacz http://fuse4bsd.creo.hu/localcgi/man-cgi.cgi?pidfile+3, zobacz sekcję "przykład". –
@Tim, strona man zawiera przykład, ale mam problemy z zastosowaniem go do mojego kodu demona. Mój demon ma inną strukturę. Na przykład nie używam demona funkcji (3). –