He estado estudiando señales en Linux. Y he hecho un programa de prueba para capturar SIGINT.¿Por qué Linux siempre muestra "^ C" al presionar Ctrl + C?
#include <unistd.h>
#include <signal.h>
#include <iostream>
void signal_handler(int signal_no);
int main() {
signal(SIGINT, signal_handler);
for (int i = 0; i < 10; ++i) {
std::cout << "I'm sleeping..." << std::endl;
unsigned int one_ms = 1000;
usleep(200* one_ms);
}
return 0;
}
void signal_handler(int signal_no) {
if (signal_no == SIGINT)
std::cout << "Oops, you pressed Ctrl+C!\n";
return;
}
mientras que la salida se ve así:
I'm sleeping...
I'm sleeping...
^COops, you pressed Ctrl+C!
I'm sleeping...
I'm sleeping...
^COops, you pressed Ctrl+C!
I'm sleeping...
^COops, you pressed Ctrl+C!
I'm sleeping...
^COops, you pressed Ctrl+C!
I'm sleeping...
^COops, you pressed Ctrl+C!
I'm sleeping...
I'm sleeping...
I'm sleeping...
entiendo que al pulsar Ctrl + C, procesa en el grupo de procesos en primer plano todo recibe una SIGINT (si no hay proceso elige ignorarlo).
Entonces, ¿el shell (bash) Y la instancia del programa anterior recibieron la señal? ¿De dónde viene el "^ C" antes de cada "Oops"?
El sistema operativo es CentOS, y el shell es bash.
Lo curioso es que la otra respuesta (que está completamente equivocada) todavía recibe votos explícitos, solo porque contiene enlaces a los Libros Correctos. – wildplasser
@WiSaGaN ¿Cómo puede ser la misma respuesta "casi correcta" (comentar) y "completamente incorrecta" (comentar OP). ** Por supuesto ** los controladores del dispositivo están involucrados cuando se comunica con un sistema a través de periféricos (¿cómo es que no mencionó el controlador del teclado?) Proporcionar más detalles no hace que una respuesta "casi correcta" sea "completamente errónea". Si fuera al nivel del lenguaje de máquina y las tablas de búsqueda, ¿eso haría que tu respuesta fuera incorrecta? Apenas. Proporcioné enlaces a libros para que OP pueda buscar más detalles según sea necesario. OP sintió que mi respuesta fue útil. Tu comentario actual es contradictorio y poco sincero en el mejor de los casos. – Levon
Lo incorrecto es que * el shell no está involucrado *. La conversión de^C a INTR tiene lugar en el controlador del terminal. El caparazón es solo un receptor (como cualquier otro proceso). El astuto no apunta al caparazón, sino al tty. – wildplasser