Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Langue C

Maîtriser la gestion des signaux en C++ : Interruption sécurisée et terminaison propre du programme

Les signaux sont des interruptions envoyées à un processus par le système d'exploitation, pouvant entraîner l'arrêt prématuré d'un programme. Vous pouvez générer ces interruptions en appuyant sur Ctrl+C sous UNIX, Linux, macOS ou Windows.

Signaux interceptables

Certains signaux ne peuvent pas être capturés par le programme, mais voici la liste des signaux que vous pouvez intercepter et traiter dans votre code. Ils sont définis dans l'en-tête C++ <csignal>.

N°Signal et description
1SIGABRT : Terminaison anormale du programme, par exemple suite à un appel à abort().
2SIGFPE : Opération arithmétique erronée, comme une division par zéro ou un débordement.
3SIGILL : Détection d'une instruction illégale.
4SIGINT : Réception d'un signal d'attention interactif (Ctrl+C).
5SIGSEGV : Accès invalide à la mémoire (segmentation fault).
6SIGTERM : Demande de terminaison envoyée au programme.

La fonction signal()

La bibliothèque C++ de gestion des signaux fournit la fonction signal pour intercepter les événements imprévus. Sa syntaxe est la suivante :

void (*signal(int sig, void (*func)(int)))(int);

Simplifiée, cette fonction prend deux arguments : le numéro du signal (entier) et un pointeur vers la fonction de gestion de ce signal.

Exemple : interception de SIGINT

Pour capturer un signal, vous devez l'enregistrer via signal() et l'associer à un gestionnaire. Voici un exemple complet :

#include <iostream>
#include <csignal>
#include <unistd.h>

using namespace std;

void signalHandler(int signum) {
    cout << "Signal d'interruption (" << signum << ") reçu.\n";
    // Nettoyage et fermeture des ressources ici
    exit(signum);
}

int main() {
    // Enregistrer SIGINT et son gestionnaire
    signal(SIGINT, signalHandler);

    while (true) {
        cout << "Mise en veille...." << endl;
        sleep(1);
    }
    return 0;
}

Lorsque vous compilez et exécutez ce programme, il affiche « Mise en veille.... » en boucle. Appuyez sur Ctrl+C pour l'interrompre :

Mise en veille....
Mise en veille....
Mise en veille....
Signal d'interruption (2) reçu.

La fonction raise()

Vous pouvez également générer des signaux programmatiquement avec la fonction raise(), qui prend un numéro de signal en argument :

int raise(int sig);

Les signaux possibles incluent : SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP.

Exemple : déclenchement interne d'un signal

#include <iostream>
#include <csignal>
#include <unistd.h>

using namespace std;

void signalHandler(int signum) {
    cout << "Signal d'interruption (" << signum << ") reçu.\n";
    exit(signum);
}

int main() {
    int i = 0;
    signal(SIGINT, signalHandler);

    while (++i) {
        cout << "Mise en veille...." << endl;
        if (i == 3) {
            raise(SIGINT); // Génère le signal après 3 itérations
        }
        sleep(1);
    }
    return 0;
}

Sortie :

Mise en veille....
Mise en veille....
Mise en veille....
Signal d'interruption (2) reçu.

Cet exemple montre comment un programme peut s'auto-interrompre après une condition donnée, utile pour les tests ou les arrêts contrôlés.

Langue C

  1. Comprendre les types de données C++ : Fondamentaux, modificateurs et bonnes pratiques
  2. Maîtriser les opérateurs C++ : Guide complet avec exemples pratiques
  3. Commentaires C++ : Bonnes pratiques pour un code lisible et maintenable
  4. Maîtriser les templates de classe en C++ : Guide pratique
  5. Gestion des fichiers en C : Maîtriser les E/S avec fopen, fprintf, fread et fseek
  6. Maîtriser la gestion d'exceptions en C++ : Exemples pratiques try, catch, throw
  7. Maîtriser la gestion d'erreurs en C : Bonnes pratiques et techniques
  8. Langage C++ : Vue d'ensemble et caractéristiques clés
  9. Constantes et littéraux en C++ : Types, syntaxe et bonnes pratiques