wiki:MikroMakroDaemon
close Warning: Can't synchronize with repository "keplertools" (/srv/svn/keplertools does not appear to be a Subversion repository.). Look in the Trac log for more information.

Version 1 (modified by bau, 10 years ago) ( diff )

--

Programmieren eines daemon in C unter Linux

Quellen:

Gerüst:

/* Secumod_Server - daemon.c */
#include <stdio.h>
#include <unistd.h>
#include <syslog.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <stdlib.h>

typedef void (*sighandler_t)(int);
volatile sig_atomic_t sigint = 1;
static sighandler_t 


/* Signalhandler (auch ignorieren von Signalen) hinzufügen */
handle_signal (int sig_nr, sighandler_t signalhandler) {
   struct sigaction neu_sig, alt_sig;
   neu_sig.sa_handler = signalhandler;
   sigemptyset (&neu_sig.sa_mask);
   neu_sig.sa_flags = SA_RESTART;
   if (sigaction (sig_nr, &neu_sig, &alt_sig) < 0)
      return SIG_ERR;
   return alt_sig.sa_handler;
}

/* Der Signalhandler für SIGINT/SIGHUP */
static void catch_sig (int sig_nr) {
   sigint--;
}


static void start_daemon (const char *log_name, int facility) {
   int i;
   pid_t pid;
   /* Elternprozess beenden, somit haben wir einen Waisen */
   /* dessen sich jetzt vorerst init annimmt              */
   if ((pid = fork ()) != 0)
      exit (EXIT_FAILURE);
   /* Kindprozess wird zum Sessionführer. Misslingt */
   /* dies, kann der Fehler daran liegen, dass der     */
   /* Prozess bereits Sessionführer ist               */
   if (setsid() < 0) {
      printf("%s kann nicht Sessionführer werden!\n",
         log_name);
      exit (EXIT_FAILURE);
   }
   /* Signal SIGHUP ignorieren */
   handle_signal (SIGHUP, SIG_IGN);
   handle_signal (SIGTERM, catch_sig);
   /* Oder einfach: signal(SIGHUP, SIG_IGN) ... */
   /* Das Kind terminieren */
   if ((pid = fork ()) != 0)
      exit (EXIT_FAILURE);
   /* Gründe für das Arbeitsverzeichnis:
    * + core-Datei wird im aktuellen Arbeitsverzeichnis 
    *   hinterlegt.
    * + Damit bei Beendigung mit umount das Dateisystem 
    *   sicher abgehängt werden kann 
    */
   chdir ("/");
   /* Damit wir nicht die Bitmaske vom Elternprozess     */
   /* erben bzw. diese bleibt, 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ämonprozess selbst kein Terminal für */
   /* die Ausgabe hat....                            */
   openlog ( log_name, 
             LOG_PID | LOG_CONS| LOG_NDELAY, facility );
}


int main (int argc, char **argv) {
   int time   = 10;
   start_daemon ("kidstimerDaemon", LOG_LOCAL0);
   syslog( LOG_NOTICE, "kidstimer - Daemon gestartet ...\n");
   while (sigint) {
      /* Enlosschleifen: Hier sollte nun der Code für den
       * Daemon stehen, was immer er auch tun soll.
       * Bspw. E-Mails abholen, versenden (was kein 
       * Verweis sein soll, um mit dem Spammen anzufangen); 
       * Bei Fehlermeldungen beispielsweise:
       * if(dies_ist_passiert)
       *    syslog(LOG_WARNING, "dies_ist_Passiert");
       * else if(das_ist_Passiert)
       *    syslog(LOG_INFO, "das_ist_Passiert"); 
       */
      sleep(time);
      syslog( LOG_NOTICE, "kidstimer - Daemon läuft bereits %d Sekunden\n", time );
      syslog( LOG_NOTICE, "kidstimer - sigint: %d\n", sigint );
     //break;
   }
   syslog( LOG_NOTICE, "kidstimer - Daemon hat sich beendet\n");
   closelog();
   return EXIT_SUCCESS;
}
Note: See TracWiki for help on using the wiki.