E-MailRelay

gdaemon_unix.cpp
Go to the documentation of this file.
1//
2// Copyright (C) 2001-2024 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_unix.cpp
19///
20
21#include "gdef.h"
22#include "gdaemon.h"
23#include "gprocess.h"
24#include "gfile.h"
25#include "gnewprocess.h"
26#include <chrono>
27#include <thread>
28
29 namespace G
30{
31 namespace DaemonImp
32 {
33 void waitfor( const G::Path & pid_file )
34 {
35 if( !pid_file.empty() )
36 {
37 for( int i = 0 ; i < 100 ; i++ )
38 {
39 if( G::File::exists( pid_file , std::nothrow ) )
40 break ;
41 std::this_thread::sleep_for( std::chrono::milliseconds(10) ) ;
42 }
43 }
44 }
45 }
46}
47
48#ifndef G_LIB_SMALL
49 void G::Daemon::detach()
50{
51 detach( G::Path() ) ;
52}
53#endif
54
55 void G::Daemon::detach( const G::Path & pid_file )
56{
57 // see Stevens, ISBN 0-201-563137-7, ch 13.
58
59 if( !NewProcess::fork().first )
60 {
61 DaemonImp::waitfor( pid_file ) ; // because systemd
62 std::_Exit( 0 ) ; // exit from parent
63 }
64
65 setsid() ;
66 Process::cd( "/" , std::nothrow ) ;
67
68 if( !NewProcess::fork().first )
69 std::_Exit( 0 ) ; // exit from parent
70}
71
72 void G::Daemon::setsid()
73{
74 GDEF_IGNORE_RETURN ::setsid() ;
75}
76
G::Daemon::detach
static void detach()
Detaches from the parent environment.
Definition: gdaemon_unix.cpp:49
G::File::exists
static bool exists(const Path &file)
Returns true if the file (directory, device etc.) exists.
Definition: gfile.cpp:136
G::NewProcess::fork
static std::pair< bool, pid_t > fork()
A utility function that forks the calling process and returns twice; once in the parent and once in t...
Definition: gnewprocess_unix.cpp:121
G::Path
A Path object represents a file system path.
Definition: gpath.h:82
G::Path::empty
bool empty() const noexcept
Returns true if the path is empty.
Definition: gpath.h:237
G::Process::cd
static void cd(const Path &dir)
Changes directory.
Definition: gprocess_unix.cpp:74
gdaemon.h
gfile.h
gnewprocess.h
gprocess.h
G
Low-level classes.
Definition: garg.h:36