GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Rufen Sie eine Funktion auf, wenn das Programm beendet ist, mit ctrl c

signal() kann auf einigen Betriebssystemen gefährlich sein und ist unter Linux zugunsten von sigaction() veraltet . "Signal gegen Signalaktion"

Hier ist ein Beispiel, auf das ich kürzlich gestoßen bin ("Tippe auf das Interrupt-Signal") und es modifiziert habe, als ich damit herumgespielt habe.

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

Für ein voll funktionsfähiges Beispiel können Sie den folgenden Code ausprobieren:

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

Beispiellauf:

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

Sie müssen das SIGINT fangen. Etwa so:

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

lädt hier mehr Details


Linux
  1. Die Dateien auflisten, auf die ein Programm zugreift?

  2. Ausführen einer ausführbaren Datei im Pfad mit demselben Namen wie eine vorhandene Funktion?

  3. Wie kann man jedes Programm mit dem Tee-Befehl zum Laufen bringen?

  4. Linux-Signale – Beispiel-C-Programm zum Abfangen von Signalen (SIGINT, SIGKILL, SIGSTOP usw.)

  5. Wie kann eine gemeinsam genutzte Bibliothek (.so) eine Funktion aufrufen, die in ihrem Ladeprogramm implementiert ist?

Lernen Sie Linux mit dem Raspberry Pi

Wie füge ich dem Kernel-Modulcode eine Abfragefunktion hinzu?

Nohup für Python-Skript funktioniert nicht, wenn es im Hintergrund mit &ausgeführt wird

Welche Signalnummern funktionieren mit dem Kill-Befehl?

Wie springe ich in einer Konsole mit STRG + Pfeiltasten zum nächsten oder vorherigen Wort?

Wann sendet das System ein SIGTERM an einen Prozess?