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 :
_____________________________________________________________________________________________
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
Il est (théoriquement) impossible de capturer sigkill pour des raisons de sécurité évidente
Faut envoyer et capturer un autre signal
Le 22 mai 2018 à 12:34:24 anaiogie a écrit :
Il est (théoriquement) impossible de capturer sigkill pour des raisons de sécurité évidenteFaut envoyer et capturer un autre signal
Je comptais capturer SIGTERM, mais je n'y arrive pas, je ne comprends pas comment cela fonctionne ^^