#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
#define LOCKFILE "/var/lock/PROCESSNAME"
#ifdef CREATE_PID_FILE
#define PIDFILE "/var/run/PROCESSNAME.pid"
#endif
void deamon (void)
{
pid_t pid, sid;
#ifdef CREATE_PID_FILE
pid_t child;
FILE *pidfp = NULL;
#endif
int lockfd = -1;
/* Create the lock file */
lockfd = open (LOCKFILE, O_RDWR | O_CREAT | O_EXCL, 0640);
if (-1 == lockfd)
{
syslog (LOG_ERR, "ERROR: Unable to create lock file [" LOCKFILE "] -> %s.", strerror(errno));
if (EEXIST == errno)
{
syslog (LOG_ERR, "ERROR: Another instance of this process might be already running. "
"Please kill that process or delete the lock file and try again.");
exit (EXIT_FAILURE);
}
}
/* Fork the child */
pid = fork();
if (-1 == pid)
{
syslog (LOG_ERR, "ERROR: Unable to fork the child process -> %s.", strerror(errno));
/* On failure, delete the lock file */
if (-1 == unlink (LOCKFILE))
{
syslog (LOG_ERR, "ERROR: Unable to delete the lock file [" LOCKFILE "] -> %s.", strerror(errno));
}
exit (EXIT_FAILURE);
}
/* Exit from the parent */
if (0 != pid)
{
exit (EXIT_SUCCESS);
}
#ifdef CREATE_PID_FILE
child = getpid();
pidfp = fopen (PIDFILE, "w");
if (NULL == pidfp)
{
syslog (LOG_ERR, "ERROR: Unable to open the pid file [" PIDFILE "] -> %s", strerror(errno));
/* On failure, delete the lock file */
if (-1 == unlink (LOCKFILE))
{
syslog (LOG_ERR, "ERROR: Unable to delete the lock file [" LOCKFILE "] -> %s.", strerror(errno));
}
exit (EXIT_FAILURE);
}
fprintf (pidfp, "%d\n", child);
fclose (pidfp);
#endif
/* Make the child as the leader of the process */
sid = setsid ();
if ((pid_t)-1 == sid)
{
syslog (LOG_ERR, "ERROR: Unable to create new seesion -> %s", strerror(errno));
/* On failure, delete the lock file and pid file */
if (-1 == unlink (LOCKFILE))
{
syslog (LOG_ERR, "ERROR: Unable to delete the lock file [" LOCKFILE "] -> %s.", strerror(errno));
}
#ifdef CREATE_PID_FILE
if (-1 == unlink (PIDFILE))
{
syslog (LOG_ERR, "ERROR: Unable to delete the lock file [" PIDFILE "] -> %s.", strerror(errno));
}
#endif
exit (EXIT_FAILURE);
}
/* Set the calling process's file mode creation mask */
umask (0);
/*
* Changing working directory to '/' to make sure that
* the process does not depend on any mounted partition
* execpt the root of the filesystem
*/
if(-1 == chdir ("/"))
{
syslog (LOG_ERR, "ERROR: Unable to change the directory to \"/\" -> %s", strerror(errno));
/* On failure, delete the lock file and pid file */
if (-1 == unlink (LOCKFILE))
{
syslog (LOG_ERR, "ERROR: Unable to delete the lock file [" LOCKFILE "] -> %s.", strerror(errno));
}
#ifdef CREATE_PID_FILE
if (-1 == unlink (PIDFILE))
{
syslog (LOG_ERR, "ERROR: Unable to delete the lock file [" PIDFILE "] -> %s.", strerror(errno));
}
#endif
exit (EXIT_FAILURE);
}
/* Close standard input file descriptor */
close (0);
/* Redirect standard output and errror to /dev/null */
freopen ( "/dev/null", "w", stdout);
freopen ( "/dev/null", "w", stderr);
}
Reference: http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html
Sunday, June 20, 2010
Create daemon process in C
Subscribe to:
Post Comments
(
Atom
)
No comments :
Post a Comment