#include
#define running_dir "/ tmp" #define lock_file "exampled.lock" #define log_file "exampled.log"
Void log_message (char * filename, char * mess) {file * logfile; logfile = fopen (filename, "a"); if (! logfile) return; fPrintf (logfile, "% s / n", message; fclose); fclose Logfile);
void signal_handler (int sig) {switch (sig) {case SIGHUP: log_message (LOG_FILE, "hangup siganl catched"); signal (SIGHUP, signal_handler); break; case SIGTERM: log_message (LOG_FILE, "terminate signal catched"); exit (0); Break;}} void daemonize () {INT I, LFP; Char Str [10];
IF (getppid () == 1) return; / * already a daemon * / i = fork (); if (i <0) exit (1); / * fork error * / if (i> 0) EXIT (0) ); / * Parent EXITS * /
Setsid (); for (i = getdtablesize (); i> = 0; - i) Close (i); / * close all descriptors * /
i = Open ("/ dev / null", o_rdwr); DUP (i); DUP (i); umask (027); chdir (running_dir);
LFP = Open (Lock_File, O_RDWR | O_CREAT, 0640); IF (LFP <0) EXIT (1); IF (Lockf (LOCKF (LFP, F_TLOCK, 0) <0) EXIT (0); / * can't lock * / / * First Instance Continues * / Sprintf (STR, "% D / N", getPID ()); Write (LFP, STR, STRLEN (STR));
Signal (SIGTSTP, SIG_IGN); SIGNAL (SIGTSTP, SIG_IGN); SIGNAL (SIGTTOU, SIG_IGN); Signal (SigTTIN, SIG_IGN); Signal (SIGTERM, SIGNAL_HANDLER); SIGNAL (SIGTERM, SIGNAL_HANDLER);}
INT main (void) {daemonize (); while (1) sleep (1);