首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用pidfile库?

如何正确使用pidfile库?
EN

Stack Overflow用户
提问于 2010-09-14 15:47:51
回答 2查看 3.8K关注 0票数 8

我已经阅读了pidfile函数族的手册页。但我真的不太明白。正确的用法是什么?有没有更详细的例子?我想我理解pidfile_open了。但是我应该在什么时候调用pidfile_writeprdfile_close呢?从哪个流程?父母还是孩子?我必须向这些函数传递什么参数?我想我可能缺乏一些*nix的基础知识。

更新:

下面是man pidfile中的示例。为什么他们要分叉两次?为什么是pidfile_close?当我调用pidfile_close时,我可以启动另一个守护进程。这不是不受欢迎的吗?

代码语言:javascript
复制
 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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-14 16:06:52

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

因此,通常在fork之前执行pidfile_open,这使您有可能给出错误消息。在分叉之后,您知道了pidfile,并且可以执行pidfile_write。

票数 5
EN

Stack Overflow用户

发布于 2013-10-26 19:45:16

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3706956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档