Ich habe bereits die man-Seite der Pidfile-Familie gelesen. Aber ich verstehe es nicht wirklich. Was ist die richtige Verwendung? Gibt es ein ausführlicheres Beispiel? Ich glaube ich verstehe pidfile_open
. Aber wann sollte ich pidfile_write
und prdfile_close
anrufen? Aus welchem Prozess? Eltern oder Kind? Welche Parameter muss ich an diese Funktionen übergeben? Mir fehlen wahrscheinlich einige * nix-Grundlagen.Wie verwende ich die PID-Datei-Bibliothek richtig?
Update:
Weiter unten finden Sie das Beispiel von Mann pidfile sehen. Warum verzweigen sie sich zweimal? Warum pidfile_close? Wenn ich pidfile_close aufruft, kann ich einen anderen Daemon starten. Ist das nicht unerwünscht?
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);
Hat die Man-Seite, die Sie sehen, einen "Beispiel" -Abschnitt? Das BSD tut man, was den allgemeinen Gebrauch recht gut veranschaulicht. Siehe http://fuse4bsd.creo.hu/localcgi/man-cgi.cgi?pidfile+3, sieh dir den Abschnitt "Beispiel" an. –
@Tim, die man-Seite enthält ein Beispiel, aber ich habe Probleme, es auf meinen Daemon-Code anzuwenden. Mein Daemon ist anders strukturiert. Zum Beispiel verwende ich nicht die Funktion daemon (3). –