/* If daemonization is configured, then starts daemonization, by forking and * returning in the child process. The parent process hangs around until the * child lets it know either that it completed startup successfully (by calling * daemon_complete()) or that it failed to start up (by exiting with a nonzero * exit code). */ void daemonize_start(void) { daemonize_fd = -1; if (detach) { if (fork_and_wait_for_startup(&daemonize_fd) > 0) { /* Running in parent process. */ exit(0); } /* Running in daemon or monitor process. */ } if (monitor) { int saved_daemonize_fd = daemonize_fd; pid_t daemon_pid; daemon_pid = fork_and_wait_for_startup(&daemonize_fd); if (daemon_pid > 0) { /* Running in monitor process. */ fork_notify_startup(saved_daemonize_fd); close_standard_fds(); monitor_daemon(daemon_pid); } /* Running in daemon process. */ } make_pidfile(); /* Make sure that the unixctl commands for vlog get registered in a * daemon, even before the first log message. */ vlog_init(); }
/* If daemonization is configured, then starts daemonization, by forking and * returning in the child process. The parent process hangs around until the * child lets it know either that it completed startup successfully (by calling * daemon_complete()) or that it failed to start up (by exiting with a nonzero * exit code). */ void daemonize_start(bool access_datapath) { assert_single_threaded(); daemonize_fd = -1; if (switch_user) { daemon_become_new_user__(access_datapath); switch_user = false; } if (detach) { pid_t pid; if (fork_and_wait_for_startup(&daemonize_fd, &pid)) { VLOG_FATAL("could not detach from foreground session"); } if (pid > 0) { /* Running in parent process. */ exit(0); } /* Running in daemon or monitor process. */ setsid(); } if (monitor) { int saved_daemonize_fd = daemonize_fd; pid_t daemon_pid; if (fork_and_wait_for_startup(&daemonize_fd, &daemon_pid)) { VLOG_FATAL("could not initiate process monitoring"); } if (daemon_pid > 0) { /* Running in monitor process. */ fork_notify_startup(saved_daemonize_fd); if (detach) { close_standard_fds(); } monitor_daemon(daemon_pid); } /* Running in daemon process. */ } forbid_forking("running in daemon process"); if (pidfile) { make_pidfile(); } /* Make sure that the unixctl commands for vlog get registered in a * daemon, even before the first log message. */ vlog_init(); }
/* If daemonization is configured, then this function notifies the parent * 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) { if (!detached) { detached = true; fork_notify_startup(daemonize_fd); daemonize_fd = -1; daemonize_post_detach(); } }
/* If daemonization is configured, then this function notifies the parent * process that the child process has completed startup successfully. */ void daemonize_complete(void) { fork_notify_startup(daemonize_fd); if (detach) { setsid(); if (chdir_) { ignore(chdir("/")); } close_standard_fds(); } }
/* If daemonization is configured, then this function notifies the parent * 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) { if (pidfile) { free(pidfile); pidfile = NULL; } if (!detached) { detached = true; fork_notify_startup(daemonize_fd); daemonize_fd = -1; daemonize_post_detach(); } }