PosixDaemon
An example, might not even compile.
#include <errno.h> #include <signal.h> #include <fcntl.h> #include <unistd.h> #define RUNNING_DIR "/" #define LOCK_FILE "/var/run/example.lock" void signal_handler(sig) { int sig; switch(sig) { case SIGHUP: break; case SIGTERM: exit(0); break; } } void daemonize() { int i,lfp; char str[10]; if (getppid() == 1) return; /* already a daemon */ if (fork() < 0) die("Failed to fork, errno=%d", errno); else exit(0); /* parent exits */ /* child (daemon) continues */ if (setsid() < 0) /* obtain a new process group */ die("Failed to become session leader, errno=%d", errno); umask(027); /* set newly created file permissions */ close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); if (open("/dev/null",O_RDONLY) == -1) { die("failed to reopen stdin while daemonising (errno=%d)",errno); } if (open("/dev/null",O_WRONLY) == -1) { die("failed to reopen stdout while daemonising (errno=%d)",errno); } if (open("/dev/null",O_RDWR) == -1) { die("failed to reopen stderr while daemonising (errno=%d)",errno); } if (chdir(RUNNING_DIR) < 0) die("Could not chdir while daemonising (errno=%d)",errno); lfp = open(LOCK_FILE, O_RDWR | O_CREAT, 0640); if (lfp<0) die("failed to open lock file errno=%d", errno); if (lockf(lfp, F_TLOCK, 0) < 0) die("failed to lock errno=%d", errno); sprintf(str, "%d\n", getpid()); write(lfp, str, strlen(str)); /* record pid to lockfile */ signal(SIGCHLD, SIG_IGN); /* ignore child */ signal(SIGTSTP, SIG_IGN); /* ignore tty signals */ signal(SIGTTOU, SIG_IGN); signal(SIGTTIN, SIG_IGN); signal(SIGHUP, signal_handler); /* catch hangup signal */ signal(SIGTERM, signal_handler); /* catch kill signal */ }