X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=daemon.c;h=0bf2f0ac9e81d72dff8623d7ebc54014007c40e4;hp=ffdec4e35f3e8cdbd113a780f6d6ade7faf9fcfe;hb=1b5c824581612cf5bf6c34f7f4472ed7a2eedbdd;hpb=b307a25ed895caa33684302b502e9e0e70dc78b7 diff --git a/daemon.c b/daemon.c index ffdec4e3..0bf2f0ac 100644 --- a/daemon.c +++ b/daemon.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "para.h" #include "daemon.h" @@ -142,14 +143,25 @@ static bool daemon_test_flag(unsigned flag) return me->flags & flag; } +static void dummy_sighandler(__a_unused int s) +{ +} + /** * Do the usual stuff to become a daemon. * - * Fork, become session leader, dup fd 0, 1, 2 to /dev/null. + * \param parent_waits Whether the parent process should pause before exit. * - * \sa fork(2), setsid(2), dup(2). + * Fork, become session leader, cd to /, and dup fd 0, 1, 2 to /dev/null. If \a + * parent_waits is false, the parent process terminates immediately. + * Otherwise, it calls pause() to sleep until it receives \p SIGTERM or \p + * SIGCHLD and exits successfully thereafter. This behaviour is useful if the + * daemon process should not detach from the console until the child process + * has completed its setup. + * + * \sa fork(2), setsid(2), dup(2), pause(2). */ -void daemonize(void) +void daemonize(bool parent_waits) { pid_t pid; int null; @@ -158,8 +170,14 @@ void daemonize(void) pid = fork(); if (pid < 0) goto err; - if (pid) + if (pid) { + if (parent_waits) { + signal(SIGTERM, dummy_sighandler); + signal(SIGCHLD, dummy_sighandler); + pause(); + } exit(EXIT_SUCCESS); /* parent exits */ + } /* become session leader */ if (setsid() < 0) goto err;