From: Gunnar Beutner Date: Fri, 30 Mar 2012 08:24:42 +0000 (+0200) Subject: Implemented Application::Daemonize method X-Git-Tag: v0.0.1~692 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=238e02b56a0e68503dc7e1a0045ac82cb88a5f58;p=icinga2 Implemented Application::Daemonize method --- diff --git a/base/application.cpp b/base/application.cpp index 31a0b5e68..efd6badf4 100644 --- a/base/application.cpp +++ b/base/application.cpp @@ -108,6 +108,50 @@ void Application::RunEventLoop(void) } } +bool Application::Daemonize(void) { +#ifndef _WIN32 + pid_t pid; + pid_t sid; + int fd; + + pid = fork(); + if (pid == -1) { + return false; + } + + if (pid) { + fprintf(stdout, "DONE\n"); + exit(0); + } + + fd = open("/dev/null", O_RDWR); + if (fd) { + if (fd != 0) { + dup2(fd, 0); + } + + if (fd != 1) { + dup2(fd, 1); + } + + if (fd != 2) { + dup2(fd, 2); + } + + if (fd > 2) { + close(fd); + } + } + + sid = setsid(); + if (sid == -1) { + return false; + } +#endif + + return true; +} + void Application::Shutdown(void) { m_ShuttingDown = true; diff --git a/base/application.h b/base/application.h index 8515ba8be..d665319de 100644 --- a/base/application.h +++ b/base/application.h @@ -22,6 +22,7 @@ public: virtual int Main(const vector& args) = 0; void RunEventLoop(void); + bool Daemonize(void); void Shutdown(void); };