GNU/Linux >> Linux Esercitazione >  >> Linux

chiama una funzione quando il programma è finito con ctrl c

signal() può essere pericoloso su alcuni sistemi operativi ed è deprecato su Linux a favore di sigaction() . "segnale contro sigazione"

Ecco un esempio in cui mi sono imbattuto di recente ("Tocca il segnale di interruzione") e modificato mentre ci giocavo.

#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;
}

Per un esempio funzionante completo puoi provare il seguente codice:

#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;
}

Esecuzione di esempio:

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

Devi prendere il SIGINT. Qualcosa del genere:

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

carica più dettagli qui


Linux
  1. Elencare i file a cui si accede da un programma?

  2. Eseguire un eseguibile nel percorso con lo stesso nome di una funzione esistente?

  3. Come far funzionare qualsiasi programma con il comando Tee?

  4. Quando assert() fallisce, qual è il codice di uscita del programma?

  5. Come aggiungere la funzione poll al codice del modulo del kernel?

Impara Linux con Raspberry Pi

Quando verificare la presenza di EINTR e ripetere la chiamata di funzione?

Come analizzo il file core dump di un programma con GDB quando ha parametri da riga di comando?

Annulla una chiamata di sistema con ptrace()

Come può una libreria condivisa (.so) chiamare una funzione implementata nel suo programma di caricamento?

Quali numeri di segnale funzionano con il comando kill?