GNU/Linux >> Tutoriales Linux >  >> Linux

llamar a una función cuando el programa haya terminado con ctrl c

signal() puede ser peligroso en algunos sistemas operativos y está obsoleto en Linux a favor de sigaction() . "señal versus sigaction"

Aquí hay un ejemplo que encontré recientemente ("Toque la señal de interrupción") y modifiqué mientras jugaba con é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;
}

Para ver un ejemplo de trabajo completo, puede probar el siguiente código:

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

Ejemplo de ejecución:

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

Tienes que coger el SIGINT. Algo como esto:

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

carga más detalles aquí


Linux
  1. Equivalente de ctrl c en comando para cancelar un programa

  2. Cuando la afirmación () falla, ¿cuál es el código de salida del programa?

  3. ¿Cuándo verificar EINTR y repetir la llamada de función?

  4. ¿Cómo analizo el archivo de volcado del núcleo de un programa con GDB cuando tiene parámetros de línea de comandos?

  5. Cancelar una llamada al sistema con ptrace()

Aprende Linux con la Raspberry Pi

¿Cómo agregar la función de encuesta al código del módulo del kernel?

¿De qué sirve ignorar la señal `SIGCHLD` con `sigaction(2)`?

¿Qué determina exactamente si un trabajo en segundo plano se cancela cuando se sale o se cancela el shell?

¿Qué números de señal funcionan con el comando de matar?

¿Cuándo envía el sistema un SIGTERM a un proceso?