Se connecter

Informatique

Programmation

Sujet : [UNIX] Besoin d'aide pour le développement d'un daemon
1
MozoPoiluche
Niveau 12
22 mai 2018 à 08:43:41

Bonjour à tous :)

Je mène actuellement un projet de BTS en équipe où je dois développer un Daemon en C++ sous le système d'exploitation Armbian 5.32 sur un NanoPi.

J'ai très peu de bases en C++, j'me suis donc aidé de différentes sources internet pour développer mon programme. Il fait pour le moment une action très simple : Il écrit dans le syslog toutes les 60 sec et s'arrête lorsque je kill le processus.

Ce que je cherche à faire maintenant c'est de le faire écrire dans le syslog "Arrêt du daemon" lorsque je kill le processus. J'ai compris que pour cela il faut que je capture le signal envoyé au programme par la commande kill mais j'ai beaucoup de mal à comprendre comment cela fonctionne.

Voici mon programme actuel :

_____________________________________________________________________________________________

  1. include <stdio.h>
  2. include <stdlib.h>
  3. include <unistd.h>
  4. include <signal.h>
  5. include <sys/types.h>
  6. include <sys/stat.h>
  7. include <syslog.h>

static void skeleton_daemon() {
pid_t pid;

/* Bifurque le processus père vers le fils*/
pid = fork();

/* Si erreur, arrêt du daemon*/
if (pid < 0) {
exit (EXIT_FAILURE);
}

/* Si succès, le père s'arrête*/
if (pid > 0) {
exit (EXIT_SUCCESS);
}

/* Si fonctionnel, le fils gère le processus */
if (setsid() < 0) {
exit (EXIT_FAILURE);
}

/* Gère ou ignore les signaux */
//TODO: Implémenter un signal ici */
signal (SIGCHLD, SIG_IGN);
signal (SIGHUP, SIG_IGN);
signal (SIGTERM, SIG_DFL);
signal (SIGINT, SIG_IGN);

/* Fork une deuxième fois*/
pid = fork();

/* Si erreur, arrêt du daemon*/
if (pid < 0) {
exit (EXIT_FAILURE);
}

/* Si aucune erreur, le père s'arrête */
if (pid > 0) {
exit (EXIT_SUCCESS);
}

/* Change le masque de mode de fichier en fonction des besoins du démon*/
umask (0);

/* Change le répertoire de travail du daemon vers la source indiquée*/
chdir ("/");

/* Ferme tous les descripteurs de fichiers */
int x;
for (x = sysconf (_SC_OPEN_MAX); x >= 0; x--) {
close (x);
}

/* Ouvre le log*/
openlog ("firstdaemon", LOG_PID, LOG_DAEMON);
}

int main() {
skeleton_daemon();

while (1) {
/* Insérer ici les processus à effectuer*/
syslog (LOG_NOTICE, "Ecriture du daemon dans le log");
syslog (LOG_NOTICE, "Attente de 60 secondes...");
sleep (60);
}

return EXIT_SUCCESS;
}

_____________________________________________________________________________________________

Je vous remercie d'avance pour les réponses que vous me fournirez :)

anaiogie
Niveau 10
22 mai 2018 à 12:34:24

Il est (théoriquement) impossible de capturer sigkill pour des raisons de sécurité évidente

Faut envoyer et capturer un autre signal

MozoPoiluche
Niveau 12
24 mai 2018 à 14:50:13

Le 22 mai 2018 à 12:34:24 anaiogie a écrit :
Il est (théoriquement) impossible de capturer sigkill pour des raisons de sécurité évidente

Faut envoyer et capturer un autre signal

Je comptais capturer SIGTERM, mais je n'y arrive pas, je ne comprends pas comment cela fonctionne ^^

1
Sujet : [UNIX] Besoin d'aide pour le développement d'un daemon
   Retour haut de page
Consulter la version web de cette page