我已经阅读了pidfile函数系列的手册页。但我不太了解。正确的用法是什么?有没有更详尽的示例?我想我了解pidfile_open
。但是我什么时候应该调用pidfile_write
和prdfile_close
?从哪个过程开始? parent 还是 child ?我必须将哪些参数传递给这些功能?我大概缺少一些* 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文件。
因此,您通常在派生之前执行pidfile_open,这使您可以给出错误消息。 fork 后,您便知道了pidfile,并且可以执行pidfile_write。