[ovs-dev] [worker v2 06/14] daemon: Factor out code into new function daemonize_post_detach().
Ben Pfaff
blp at nicira.com
Wed Jun 27 18:25:22 UTC 2012
This code will have another user in an upcoming commit.
Signed-off-by: Ben Pfaff <blp at nicira.com>
---
lib/daemon.c | 27 ++++++++++++++++++++++-----
lib/daemon.h | 1 +
2 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/lib/daemon.c b/lib/daemon.c
index a2eff07..84ed614 100644
--- a/lib/daemon.c
+++ b/lib/daemon.c
@@ -39,7 +39,8 @@
VLOG_DEFINE_THIS_MODULE(daemon);
/* --detach: Should we run in the background? */
-static bool detach;
+static bool detach; /* Was --detach specified? */
+static bool detached; /* Have we already detached? */
/* --pidfile: Name of pidfile (null if none). */
static char *pidfile;
@@ -513,22 +514,38 @@ daemonize_start(void)
}
/* If daemonization is configured, then this function notifies the parent
- * process that the child process has completed startup successfully.
+ * process that the child process has completed startup successfully. It also
+ * call daemonize_post_detach().
*
* Calling this function more than once has no additional effect. */
void
daemonize_complete(void)
{
- fork_notify_startup(daemonize_fd);
- daemonize_fd = -1;
+ if (!detached) {
+ detached = true;
+
+ fork_notify_startup(daemonize_fd);
+ daemonize_fd = -1;
+ daemonize_post_detach();
+ }
+}
+/* If daemonization is configured, then this function does traditional Unix
+ * daemonization behavior: join a new session, chdir to the root (if not
+ * disabled), and close the standard file descriptors.
+ *
+ * It only makes sense to call this function as part of an implementation of a
+ * special daemon subprocess. A normal daemon should just call
+ * daemonize_complete(). */
+void
+daemonize_post_detach(void)
+{
if (detach) {
setsid();
if (chdir_) {
ignore(chdir("/"));
}
close_standard_fds();
- detach = false;
}
}
diff --git a/lib/daemon.h b/lib/daemon.h
index 63b64b9..8cbcfaf 100644
--- a/lib/daemon.h
+++ b/lib/daemon.h
@@ -74,5 +74,6 @@ pid_t read_pidfile(const char *name);
pid_t read_pidfile_if_exists(const char *name);
pid_t fork_and_clean_up(void);
+void daemonize_post_detach(void);
#endif /* daemon.h */
--
1.7.2.5
More information about the dev
mailing list