Typically this process is sort of a pain, but I went out and looked up all the things you need to do to successfully become a deamon and put it all in this one function.
This way you can just copy and paste this into your own programs and become a deamon whenever you want.
I don't have any copyright on this function, it is an amalgamation of standard techniques from many sources.
/*
* Do whatever it takes to become a deamon process
*/
void become_deamon ( struct conf_t *conf ) {
int i, max_files, fd;
/* following line could be adjusted to output info for your particular program */
/* notify(__FILE__, __LINE__, "Beginning become_deamon"); */
/* close all open file descriptors */
max_files=getdtablesize();
for (i = 0; i < max_files; i++)
close(i);
/* change to log directory */
/* chdir(conf.defaults.logdir); */
chdir("/");
/* reset the file access creation mask */
umask(0);
/* ignore terminal i/o signals */
#ifdef SIGTTOU
signal(SIGTTOU, SIG_IGN);
#endif
#ifdef SIGTTIN
signal(SIGTTIN, SIG_IGN);
#endif
#ifdef SIGTSTP
signal(SIGTSTP, SIG_IGN);
#endif
/* run in the background */
/* disassociate from process group */
setpgrp();
/* disassociate from control terminal */
if ( fork() != 0)
exit(0); /* parent process */
setpgrp();
if ( fork() != 0)
exit(0); /* parent process */
if ( (fd = open("/dev/tty", O_RDWR)) >= 0) {
ioctl(fd, TIOCNOTTY, (char *) 0); /* lose control tty */
close(fd);
}
/* don't reacquire a control terminal */
} /* end become_deamon */
No comments:
Post a Comment