daemonize.c

Go to the documentation of this file.
00001 /*
00002  * Copyright (C), 2000-2002 by Contributors to the monit codebase. 
00003  * All Rights Reserved.
00004  *
00005  * This program is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU General Public License as
00007  * published by the Free Software Foundation; either version 2 of the
00008  * License, or (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful, but
00011  * WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  * General Public License for more details.
00014  * 
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program; if not, write to the Free Software Foundation,
00017  * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
00018  */
00019 
00020 
00021 #include <config.h>
00022 
00023 #include <stdio.h>
00024 #include <stdlib.h>
00025 #include <errno.h>
00026 #include <signal.h>
00027 
00028 #ifdef HAVE_UNISTD_H
00029 #include <unistd.h>
00030 #endif
00031 
00032 #ifdef HAVE_SYS_TYPES_H
00033 #include <sys/types.h>
00034 #endif
00035 
00036 #ifdef HAVE_SYS_STAT_H
00037 #include <sys/stat.h>
00038 #endif
00039 
00040 #ifdef HAVE_FCNTL_H
00041 #include <fcntl.h>
00042 #endif
00043 
00044 #ifdef HAVE_STRING_H
00045 #include <string.h>
00046 #endif
00047 
00048 #include "monitor.h"
00049 
00050 
00063 /* ------------------------------------------------------------------ Public */
00064 
00065 
00070 void  daemonize() {
00071 
00072   pid_t pid;
00073   void *hup_handler= NULL;
00074   
00075   /*
00076    * Clear file creation mask
00077    */
00078   umask(0);
00079 
00080   /*
00081    * Become a session leader to lose our controlling terminal
00082    */
00083   if((pid= fork ()) < 0) {
00084     
00085     log("Cannot fork of a new process\n");  
00086     exit (1);
00087     
00088   }  
00089   else if(pid != 0) {
00090     
00091     _exit(0);
00092     
00093   }
00094   
00095   setsid();
00096 
00097   /*
00098    * Don't let future opens allocate controlling terminals
00099    */
00100   hup_handler= signal(SIGHUP, SIG_IGN);
00101 
00102   if((pid= fork ()) < 0) {
00103     
00104     log("Cannot fork of a new process\n");  
00105     exit (1);
00106     
00107   }  
00108   else if(pid != 0) {
00109     
00110     _exit(0);
00111     
00112   }
00113 
00114   
00115   /*
00116    * Change current directory to the root so that other file systems
00117    * can be unmounted while we're running
00118    */
00119   if(chdir("/") < 0) {
00120     
00121     log("Cannot chdir to / -- %s\n", STRERROR);
00122     exit(1);
00123     
00124   }
00125 
00126   /*
00127    * Attach standard descriptors to /dev/null. Other descriptors
00128    * should be closed in env.c
00129    */
00130   redirect_stdfd();
00131 
00132   /*
00133    * Reset the SIGHUP handler
00134    */
00135   if(hup_handler)
00136       signal(SIGHUP, hup_handler);
00137 
00138 } 
00139 
00140 
00145 int kill_daemon() {
00146   
00147   pid_t pid;
00148 
00149   if ( (pid= exist_daemon()) > 0 ) {
00150     
00151     if ( kill(pid, SIGTERM) < 0 ) {
00152       
00153       error("%s: Cannot kill daemon process -- %s\n",prog, STRERROR);
00154       return FALSE;
00155       
00156     }
00157     
00158   } else {
00159     
00160     error("%s: No daemon process found\n", prog);
00161     return TRUE;
00162     
00163   }
00164   
00165   fprintf(stdout, "%s daemon with pid [%d] killed\n", prog, (int)pid);
00166   fflush(stdout);
00167   
00168   return TRUE;
00169   
00170 }
00171 
00172 
00177 int exist_daemon() {
00178 
00179   pid_t pid;
00180   struct myprocess d;
00181   
00182   d.pidfile= Run.pidfile;
00183   pid= is_process_running(&d);
00184   
00185   return ( (int)pid ) ;
00186 
00187 }
00188