#include <stdio.h>
#include <unistd.h>
#include <syslog.h>
#include <sys/types.h>

#define CHILD 0
#define ERROR -1

void start_daemon(char *log_name, int facility)
{
 int i;
 pid_t pid;

 /*Elternprozeß beenden, somit haben wir einen Waisen
   dessen sie jetzt vorerst init annimmt*/
 if((pid = fork()) != CHILD) exit(0);
 /*Unser Kindprozess wird zum Session-Führer. Mißlingt dies,
   kann der Fehler daran liegen das der Prozeß bereits Sessionführer
   ist */
 if(setsid() == ERROR)
  {
  fprintf(stderr, "%s kann nicht Session-Führer werden!\n",log_name);
  exit(0);
  }
 /* Gründe für das Root-Wurzelverzeichnis:
    +core-Datei wird im aktuellen Arbeitsverzeichnis hinterlegt
    +Damit bei Beendigung mit umount das Dateisystem sicher abgehängt
     werde kann */
 chdir("/");
 /*Damit wir nicht die Bitmaske vom Elternprozeß erben bzw. diese
   bleiben, stellen wir diese auf 0*/
 umask(0);
 /*Wir schließen alle geöffneten Filedeskriptoren....*/
 for(i=sysconf(_SC_OPEN_MAX); i>0; i--)
  close(i);

 /*Da unser Dämonprozeß selbst kein Terminal für die Ausgabe hat....*/
 openlog(log_name, LOG_PID, facility);
}


int main(int argc, char **argv)
{
 start_daemon("meinDaemon", LOG_USER);
 while(1);
 /*Enlossschleifen: Hier sollte nun der Code für den
   Daemon stehen, was immer er auch tun soll.
   Bei Fehlermeldungen Beispiesweise:
   if(dies_ist_Passiert)
    syslog(LOG_WARNING, "dies_ist_Passiert");
   else if(das_ist_Passiert)
    syslog(LOG_INFO, "das_ist_Passiert");*/
 return 0;
}