Quiero hacer una combinación específica de teclas del teclado para finalizar un proceso. Por ejemplo, quiero finalizar el proceso presionando CTRL + C ^ 3 (presionando tres veces C: CTRL + CCC).
Básicamente quiero reemplazar CTRL + C con CTRL + CCC
Respuesta1
El comportamiento predeterminado de Ctrl+ Ces una combinación de dos cosas. El controlador del terminal¹ no transmite esta pulsación de tecla, sino que envía unaseñal SEÑALal proceso de primer plano². De forma predeterminada, un proceso muere cuando recibe un SIGINT, pero el proceso puede configurar un controlador de señal y luego ejecutará el controlador de señal cuando reciba SIGINT.
No hay forma de configurar el controlador del terminal para convertir solo el tercer Ctrl+ Cconsecutivo para finalizar el proceso en primer plano. Para hacer eso, necesitas contar hasta tres en tu programa. Hay dos formas de hacerlo, que se comportarán de manera diferente si el usuario presiona algo más entre los Ctrl+ C.
Una forma es deshabilitar el comportamiento de Ctrl+ Cde enviar una señal y decirle al controlador del terminal que la pase. Puedes hacerlo llamandostty intr \^-
desde un script de shell otcsetattr(fd, &termios)
con termios.c_cc[VINTR]
conjunto _POSIX_VDISABLE
desde C. Luego, en el ciclo de procesamiento de entrada de su programa, salga cuando haya visto tres Ctrl+ Cseguidos.
La otra forma es configurar un controlador de señal para SIGINT que cuente cuántas veces se ha invocado y finalice el programa la tercera vez. Es posible que desees restablecer el contador si hay una entrada normal en el medio.
¹ No el emulador de terminal, la parte genérica del sistema operativo que maneja todos los terminales.
² Sólo estoy explicando el caso simple. Este no es un tratado sobre cómo funciona el controlador de terminal.
Respuesta2
No puede cambiar la combinación de teclas en su código porque una señal es una interrupción generada por software que el sistema operativo envía a un proceso. cuando el usuario presiona Ctrl-c, otro proceso le dice algo a su proceso.
Hay un conjunto fijo de señales que se pueden enviar a un proceso. Las señales son similares a las interrupciones, la diferencia es que las interrupciones están mediadas por el procesador y manejadas por el kernel, mientras que las señales están mediadas por el kernel (posiblemente a través de llamadas al sistema) y manejadas por procesos. El kernel puede pasar una interrupción como señal al proceso que la causó (los ejemplos típicos son SIGSEGV, SIGBUS, SIGILL y SIGFPE).
puedes reasignar la combinación de teclas de señal en tu computadora con stty
Habilite Ctrl+C para copiar y Ctrl+Shift+C para interrumpir
https://docstore.mik.ua/orelly/unix3/upt/ch05_08.htm
si quieres exactamente 3 veces presiona ctrl-c. puede contar SIGINT e interrumpir el programa cuando presione Ctrl-c 3 veces. (presionando tres veces C: CTRL +CCC).
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
void sig_handler(int signo)
{
static int counter=0;
if (signo == SIGINT)
counter++;
printf("received SIGINT %d times\n", counter);
if (counter == 3)
exit(0);
}
int main()
{
if (signal(SIGINT, sig_handler) == SIG_ERR)
printf("\ncan't catch SIGINT\n");
while(1)
sleep(1);
return 0;
}