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 */
}