Linuxでのデーモンの作成

8608 ワード

引用:Creating a daemon in Linux-Pascal Werkl
/*
 * daemonize.c
 * This example daemonizes a process, writes a few log messages,
 * sleeps 20 seconds and terminates afterwards.
 */

#include 
#include 
#include 
#include 
#include 

static void skeleton_daemon()
{
	pid_t pid;

	/* Fork off the parent process */
	pid = fork();

	/* An error occurred */
	if (pid < 0)
		exit(EXIT_FAILURE);

	/* Success: Let the parent terminate */
	if (pid > 0)
		exit(EXIT_SUCCESS);

	/* On Success: The child process becomes session leader */
	if (setsid() < 0)
		exit(EXIT_FAILURE);

	/* Catch, ignore and handle signals */
	//TODO: Implement a working signal handler
	signal(SIGCHLD, SIG_IGN);
	signal(SIGHUP, SIG_IGN);

	/* Fork off for the second time */
	pid = fork();

	/* An error occurred */
	if (pid < 0)
		exit(EXIT_FAILURE);

	/* Success: Let the parent terminate */
	if (pid > 0)
		exit(EXIT_SUCCESS);

	/* Set new file permissions */
	umask(0);

	/* Change the working directory to the root directory */
	/* or another appropriated directory */
	chdir("/");

	/* Close all open file descriptors */
	int x;
	for (x = sysconf(_SC_OPEN_MAX); x>=0; x--)
	{
		close(x);
	}

	/* Open the log file */
	openlog("firstdaemon", LOG_PID, LOG_DAEMON);
}

int main()
{
	skeleton_daemon();

	while (1)
	{
		//TODO: Insert daemon code here.
		syslog(LOG_NOTICE, "First daemon started.");
		sleep(20);
		break;
	}

	syslog(LOG_NOTICE, "First daemon terminated.");
	closelog();

	return EXIT_SUCCESS;
}