繁体   English   中英

如何正确使用pidfile库?

[英]How to use the pidfile library correctly?

我已经阅读了pidfile函数系列的手册页。 但我真的不明白。 什么是正确的用法? 有没有更精细的例子? 我想我理解pidfile_open 但什么时候应该调用pidfile_writeprdfile_close 从哪个过程? 父母还是孩子? 我必须将哪些参数传递给这些函数? 我猜想我缺少一些* nix基础知识。

更新:

下面你看到man pidfile的例子。 为什么他们两次叉? 为什么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);

问题是您希望在守护进程生成之前给出错误消息,并且在生成守护进程后知道PID文件。

因此,您通常在fork之前执行pidfile_open,这样您就可以给出错误消息。 分叉后,你知道pidfile,你可以做pidfile_write。

在进入后台之前,您可以执行pidfile_open(3),这样您就可以立即报告任何问题。 你还没有写PID,因为你的PID会在守护进程(3)之后改变。 pidfile_open(3)只锁定pidfile。 在守护进程(3)之后,您可以调用pidfile_write(3),因为您现在拥有最终的PID(内部守护进程(3)分叉)。 在主进程中你不能调用pidfile_close(3),因为这是整个想法 - 通过保持pidfile打开并锁定你让别人知道你还活着。 第二个分支是完全可选的。 它说明了守护进程生成子进程/工作进程的常见行为。 如果你不使用它们,你不需要这个fork()。 这个fork()只是为了表明在这样的工作进程中你应该关闭pid文件,所以它只是由主进程而不是子进程保持打开和锁定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM