Я могу ответить на этот вопрос полностью в коде. Написание демона примерно состоит из следующих действий:
/*
* Daemon Initialisation:
* 1. Fork()
* 2. setsid()
* 3. Fork() do we need to do this twice?
* 4. Chdir /
* 5. Umask(0)
* 6. Close STDIN/OUT/ERR
* 7. Optionally re-open stuff.
*
* Refs:
* 1. http://www.faqs.org/faqs/unix-faq/programmer/faq/
* 2. http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html
* 3. http://www.enderunix.org/docs/eng/daemon.php
*/
/* Variables */
/* Our process ID and Session ID */
pid_t pid, sid;
int fd = 0;
/* Fork off the parent process */
pid = fork();
if (pid < 0)
{
exit(EXIT_FAILURE);
}
/* If we got a good PID, then
* we can exit the parent process.
*/
if (pid > 0)
{
exit(EXIT_SUCCESS);
}
/* Create a new SID for the child process */
sid = setsid();
if (sid < 0)
{
/* Log the failure */
exit(EXIT_FAILURE);
}
/* Fork off the parent process, again */
pid = fork();
if (pid < 0)
{
exit(EXIT_FAILURE);
}
/* If we got a good PID, then
we can exit the parent process. */
if (pid > 0)
{
exit(EXIT_SUCCESS);
}
/* Change the current working directory */
if ((chdir("/")) < 0)
{
/* Log the failure */
exit(EXIT_FAILURE);
}
/* Change the file mode mask */
umask(0);
/* Close all file descriptors */
for (fd = getdtablesize(); fd >= 0; --fd)
{
close(fd);
}
/* Open standard file descriptors from
* elsewhere.
* e.g. /dev/null -> stdin.
* /dev/console -> stderr?
* logfile as stdout?
*/
fd = open("/dev/null", O_RDWR); /* open stdin */
dup(fd); /* stdout */
dup(fd); /* stderr */
Это все вызовы функций C, но, конечно, вы можете вызывать их из C ++.
Причина, по которой я сидел в этом коде, заключается в том, что на самом деле это функция, которую я передаю указателям на функции, которые выполняют мое "тело демона". Почему я делаю это так? Чтобы выяснить, где мои ошибки запускают код непосредственно как процесс (если необходимо с привилегиями root), я "демонизирую". В противном случае довольно сложно отлаживать процесс демона ...
Edit: конечно, использование указателей на функции - это образ мышления на языке C, но нет никаких причин, по которым вы не можете реализовать какую-либо форму механизма на основе классов.
Так что, если честно, это действительно не имеет значения. Выберите то, что вы предпочитаете.