= Programmieren eines daemon in C unter Linux = Quellen: * http://openbook.rheinwerk-verlag.de/linux_unix_programmierung/Kap07-011.htm * http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html Gerüst: {{{ /* Secumod_Server - daemon.c */ #include #include #include #include #include #include #include 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; } }}}