1 // 2 // Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net> 3 // 4 // This program is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // This program is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with this program. If not, see <http://www.gnu.org/licenses/>. 16 // === 17 /// 18 /// \file gdaemon.h 19 /// 20 21 #ifndef G_DAEMON_H 22 #define G_DAEMON_H 23 24 #include "gdef.h" 25 #include "gexception.h" 26 #include "gpidfile.h" 27 #include "gpath.h" 28 #include <sys/types.h> 29 #include <string> 30 31 /// \namespace G 32 namespace G 33 { 34 class Daemon ; 35 } 36 37 /// \class G::Daemon 38 /// A class for deamonising the calling process. 39 /// Deamonisation includes fork()ing, detaching from the 40 /// controlling terminal, setting the process umask, etc. 41 /// The windows implementation does nothing. 42 /// \see G::Process 43 /// 44 class G::Daemon 45 { 46 public: 47 G_EXCEPTION( CannotFork , "cannot fork" ) ; 48 49 static void detach() ; 50 ///< Detaches from the parent environment. 51 ///< This typically involves fork()ing, 52 ///< _exit()ing the parent, and calling 53 ///< setsid() in the child. 54 55 static void detach( PidFile & pid_file ) ; 56 ///< An overload which allows for a delayed write 57 ///< of the new process-id to a file. 58 ///< 59 ///< A delayed write is useful for network daemons 60 ///< which open a listening port. A second instance 61 ///< of the process will fail on startup, and should 62 ///< not overwrite the pid file of the running 63 ///< server. In this situation PidFile::commit() 64 ///< should be called just before entering the event 65 ///< loop. 66 ///< 67 ///< Throws PidFile::Error on error. 68 69 private: 70 Daemon() ; 71 static void setsid() ; 72 } ; 73 74 #endif 75 76