GNU/Linux >> Znalost Linux >  >> Linux

zavolejte funkci po dokončení programu pomocí ctrl c

signal() může být na některých operačních systémech nebezpečný a na Linuxu je zastaralý ve prospěch sigaction() . "signál versus sigaction"

Zde je příklad, na který jsem nedávno narazil („Klepněte na signál přerušení“) a upravil jsem ho, když jsem si s ním hrál.

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

Pro úplný funkční příklad můžete vyzkoušet následující kód:

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

Příklad spuštění:

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

Musíte chytit SIGINT. Něco takového:

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

načte více podrobností zde


Linux
  1. Jaký je ukončovací kód programu, když selžeasses()?

  2. Jak mohu analyzovat soubor výpisu jádra programu pomocí GDB, když má parametry příkazového řádku?

  3. Zrušit systémové volání pomocí ptrace()

  1. Jak může sdílená knihovna (.so) volat funkci, která je implementována v jejím načítacím programu?

  2. Jak přidat funkci dotazování do kódu modulu jádra?

  3. K čemu slouží ignorování signálu `SIGCHLD` pomocí `sigaction(2)`?

  1. Seznam souborů, ke kterým program přistupuje?

  2. Jak přejdu na další nebo předchozí slovo pomocí CTRL + kláves se šipkami v konzole?

  3. Kdy systém odešle SIGTERM procesu?