GNU/Linux >> Tutoriels Linux >  >> Linux

appeler une fonction lorsque le programme est terminé avec ctrl c

signal() peut être dangereux sur certains systèmes d'exploitation et est obsolète sur Linux au profit de sigaction() . "signal contre signal"

Voici un exemple que j'ai rencontré récemment ("Appuyez sur le signal d'interruption") et que j'ai modifié pendant que je jouais avec.

#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<string.h>

struct sigaction old_action;

void sigint_handler(int sig_no)
{
    printf("CTRL-C pressed\n");
    sigaction(SIGINT, &old_action, NULL);
    kill(0, SIGINT);
}

int main()
{

    struct sigaction action;
    memset(&action, 0, sizeof(action));
    action.sa_handler = &sigint_handler;
    sigaction(SIGINT, &action, &old_action);

    pause();

    return 0;
}

Pour un exemple de travail complet, vous pouvez essayer le code suivant :

#include <signal.h>
#include <stdio.h>
#include <stdbool.h>

volatile bool STOP = false;
void sigint_handler(int sig);

int main() {
    signal(SIGINT, sigint_handler);
    while(true) {
        if (STOP) {
            break;
        }
    }
    return 0;
}

void sigint_handler(int sig) {
    printf("\nCTRL-C detected\n");
    STOP = true;
}

Exemple d'exécution :

[[email protected]]$ ./a.out 
^C
CTRL-C detected

Vous devez attraper le SIGINT. Quelque chose comme ça :

void sigint_handler(int sig)
{
    [do some cleanup]
    signal(SIGINT, SIG_DFL);
    kill(getpid(), SIGINT);
}

charge plus de détails ici


Linux
  1. Lister les fichiers accessibles par un programme ?

  2. Exécuter un exécutable dans le chemin avec le même nom qu'une fonction existante ?

  3. Comment faire fonctionner n'importe quel programme avec la commande Tee ?

  4. Que fait un programme lorsqu'il envoie un signal Sigkill ?

  5. Signaux Linux - Exemple de programme C pour capturer des signaux (SIGINT, SIGKILL, SIGSTOP, etc.)

Apprendre Linux avec le Raspberry Pi

Nohup pour le script Python ne fonctionne pas lors de l'exécution en arrière-plan avec &

Qu'est-ce qui détermine exactement si un travail en arrière-plan est tué lorsque le shell est quitté, ou tué ?

Quels numéros de signal fonctionnent avec la commande kill ?

Comment passer au mot suivant ou précédent avec les touches CTRL + flèches dans une console ?

Quand le système envoie-t-il un SIGTERM à un processus ?