pidfile関数ファミリのマニュアルページをすでに読みました。しかし、私はそれを本当に理解していません。正しい使用法は何ですか?より複雑な例はありますか?私は理解していると思いますpidfile_open
。しかし、いつ電話すればいいpidfile_write
ですprdfile_close
か?どのプロセスから?親か子か?これらの関数に渡す必要のあるパラメーターは何ですか?私はおそらくいくつかの*nixの基礎を欠いていると思います。
アップデート:
以下に、manpidfileの例を示します。なぜ彼らは二度フォークするのですか?なぜ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);