Ich habe Signale in Linux studiert. Und ich habe ein Testprogramm gemacht, um SIGINT zu erfassen.Warum gibt Linux beim Drücken von Strg + C immer "^ C" aus?
#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;
}
Während die Ausgabe wie folgt aussieht:
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...
Ich verstehe, dass, wenn Sie Strg + C drücken, werden alle Prozesse im Vordergrund Prozessgruppe eine SIGINT erhält (wenn kein Prozess, es zu ignorieren wählt).
Also ist es, dass die Shell (bash) UND die Instanz des oben genannten Programms beide das Signal erhalten? Woher kommt das "^ C" vor jedem "Ups"?
Das Betriebssystem ist CentOS, und die Shell ist bash.
Lustige Sache ist, dass die andere Antwort (die einfach falsch ist) immer noch upvotes, nur weil es Links zu den richtigen Büchern enthält. – wildplasser
@WiSaGaN Wie kann die gleiche Antwort "fast richtig" (Kommentar zu mir) und "einfach falsch" (Kommentar zu OP) sein. ** Natürlich ** Gerätetreiber sind beteiligt bei der Kommunikation mit einem System über Peripheriegeräte (Wie kommt es, dass Sie den Tastaturtreiber nicht erwähnt haben?) Die Angabe von mehr Details macht eine "fast richtige" Antwort nicht "einfach falsch". Wenn ich auf die Ebene der Maschinensprache und der Nachschlagetabellen gehe, würde das Ihre Antwort falsch machen? Kaum. Ich stellte Links zu Büchern zur Verfügung, damit OP bei Bedarf mehr Details nachschlagen konnte. OP fühlte, dass meine Antwort hilfreich war. Ihr aktueller Kommentar ist bestenfalls widersprüchlich und unaufrichtig. – Levon
Das Falsche ist, dass * die Shell nicht beteiligt ist *. Die Konvertierung von^C nach INTR erfolgt im Terminaltreiber. Die Shell ist nur ein Rezeptor (wie bei jedem anderen Prozess). Die Shell zielt nicht auf die Shell, sondern auf die Tastatur. – wildplasser