8

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);
4

2 に答える 2

5

問題は、デーモンが生成される前にエラー メッセージを表示したいことと、デーモンが生成された後に PID ファイルを知っていることです。

したがって、通常、フォークの前に pidfile_open を実行すると、エラー メッセージが表示される可能性があります。フォークした後、pidfile がわかり、pidfile_write を実行できます。

于 2010-09-14T08:06:51.820 に答える