Wird das laufende Programm durch mehrmaliges Drücken von Strg-C schneller geschlossen?

41

Ich fange oft an, eine große Datei zu lesen und möchte sie nach einer Weile beenden, aber es gibt eine Verzögerung, wenn ich
Ctrl+ drücke, Cbis das Programm stoppt. Kann die Verzögerung durch mehrmaliges Drücken der Taste Ctrl+ verkürzt werden C? Oder verschwende ich meine Tastendrücke?

Die lustlose Katze
quelle
Beim Ausführen eines Prozesses, der verschiedene untergeordnete Prozesse aufruft, ist mir aufgefallen, dass Strg-C manchmal das ausgeführte untergeordnete, aber nicht den übergeordneten Prozess unterbricht. Das ist richtig in bash, aber nicht der Fall, in zshdem immer der Elternteil schließt. Das ist einer der Gründe, die ich mag zsh.
Joeytwiddle
17
Ja, genau wie das wiederholte Drücken des Fahrstuhlknopfs oder des Cross-Walk-Knopfs bewirkt dies, dass der Fahrstuhl früher kommt oder das Licht schneller grün wird.
Michael
3
Ja, genau wie Tasten für Aufzüge und Fußgängerüberwege kann STRG-C auch klebrig oder rostig werden oder zweifelhafte Verbindungen aufbauen. Mehrmaliges Drücken ist eine gute Taktik, da nur ein Tastendruck registriert werden muss, damit der Aufzug kommt, das Laufzeichen aufleuchtet oder das Programm geschlossen wird.
Hippietrail
1
@ Hippietrail, aber Ihre Shell wird gedruckt, ^Cwenn es die Presse registriert (zumindest Bash tut)
wchargin
1
Für das, was es wert ist, halte ich es nicht für eine Verschwendung meiner Tastendrücke - ich halte es für eine Enttäuschung, die nicht schädlich ist. (Ich habe es normalerweise 2-3 Mal gedrückt, aber das liegt zum Teil daran, dass ich an Terminals "aufgewachsen" bin, die über Telefonleitungen angeschlossen sind, bei denen man nicht immer mit jedem einzelnen Tastendruck rechnen kann, der die Maschine erreicht.)
keshlam

Antworten:

35

Nach der ersten Ctrl-Cwird das Programm empfangen SIGINTund beginnt in der Regel mit der Bereinigung (Löschen von tmp-Dateien, Schließen von Sockets usw.). Wenn Sie Ctrl-Cwährenddessen erneut drücken, kann es vorkommen, dass Sie die Bereinigungsroutine unterbrechen (dh, das zusätzliche Signal wird möglicherweise bearbeitet, anstatt in Ruhe gelassen zu werden) und ein Chaos hinterlassen. Während dies in der Regel nicht der Fall ist, häufiger die zusätzlichen Signale tatsächlich gesendet werden, nachdemDer Prozess wurde beendet (aufgrund der Verzögerungen bei der Interaktion des Bedieners mit dem System). Das bedeutet, dass Signale von einem anderen Prozess empfangen werden (oft Shell, aber nicht immer). Wenn dieser Empfänger dieses Signal nicht richtig handhabt (wie dies normalerweise bei Shell der Fall ist - siehe die Antwort von Jenny D), sind Sie möglicherweise unangenehm überrascht über das Ergebnis einer solchen Aktion.

John1024
quelle
Warum sollte es die Aufräumroutine unterbrechen? Es ist nur ein weiteres Signal INT, das der Prozess erhält.
Chaos
4
@chaos Warum sollte es? Dies sollte der Fall sein, wenn die Bereinigungsroutine nicht mehr funktioniert und Sie sie beenden möchten. Funktioniert es tatsächlich so? Ja, ziemlich oft. Sie können es einfach genug demonstrieren: Erstellen Sie ein Bash-Skript mit der einzelnen Zeile trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10. Führen Sie das Skript aus und drücken Sie zweimal Strg-C. Sie werden sehen, dass die zweite Strg-C-Taste an die Routine "Aufräumen" (in der Trap-Anweisung) übergeben wird und ihren sleepBefehl beendet .
John1024
1
@ John1024 Ah, jetzt sehe ich es. Danke für das Skript-Snippet ^^ Aber die Bereinigung wird nicht abgebrochen, siehe: trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10Es sind nur die sleepBefehle, die die Signale erhalten. Wir waren beide falsch xD
Chaos
2
Das ist falsch Die Signalübertragung erfolgt synchron. Wenn eingeschaltet isigist, wird, sobald STRG-C gedrückt und vom Kernel empfangen wird (für einen Terminalemulator, sobald der Terminalemulator es auf die Masterseite des Pseudoterminals schreibt), das SIGINT-Signal an alle gesendet Prozesse in der Vordergrund-Prozessgruppe des Terminals. Möglicherweise wird es dort blockiert, aber später nicht an einen anderen Prozess übergeben. Selbst wenn der Pufferspeicher des Endgeräts voll ist (die Anwendungen haben nichts von den eingegebenen Dingen gelesen), springt die Tastenkombination STRG-C in die Warteschlange.
Stéphane Chazelas
1
Ja, als Beispiel interpretiert VLC mehrere Ctrl + C-Signale als einen Weg, um unsauber zu beenden, während ein einzelnes Ctrl + C versucht, sauber zu beenden.
Jeremy Visser
11

Du verschwendest sie. Alles was passiert ist, dass sobald der Server mit der Bildschirmausgabe fertig ist, er mehrere empfängt Ctrl-C. Der erste wird verwendet, um den Prozess abzubrechen, und die folgenden werden in Ihrer Shell enden, die dann ungefähr so ​​aussieht

[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ 
Jenny D
quelle
6
Der Prozess wird nicht unbedingt beendet, wenn ein SIGINT gesendet wird. Es könnte unbegrenzt am Leben bleiben und bei jedem Drücken von Strg + C etwas anderes tun.
Brian Gordon
Wahr. Ich machte Annahmen darüber, wie der Benutzer die Datei liest.
Jenny D
5

Kurze Antwort: Wenn der Prozess darauf reagiert.

Lange Antwort: Wenn Sie ctrl+ cdrücken, sendet der Kernel ein Signal an den Prozess. Welches Signal kann mit folgendem Befehl ermittelt werden:

user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;

Siehe die Manpage von stty:

   intr CHAR
          CHAR will send an interrupt signal

Es ist das Signal INT, auch als Nummer 2 bekannt. Wenn der Prozess einen Signal-Handler hat, kann er darauf reagieren. Die meisten Prozesse führen einige Bereinigungsjobs aus, um erfolgreich zu enden.

Chaos
quelle
Strg-Z sendet normalerweise SIGTSTP, das behandelt werden kann (im Gegensatz zu SIGSTOP).
Peterph
4
Nein, es ist nicht die Shell, die den SIGINT an den Prozess sendet. Es ist die kernel(die Linie Disziplin des Terminals, die Terminal - Treiber) , die SIGINT zu jedem Prozess im Vordergrund Prozess sendet Gruppe des Terminals.
Stéphane Chazelas
Zukünftige Leser finden Sie unter unix.stackexchange.com/a/120071/135943 .
Wildcard
4

Du hast recht. Die Tastendrücke werden verschwendet. Wenn Sie auf drücken Crtl+Cund es erkannt wird, müssen einige Ressourcen gelöscht werden, weshalb dies einige Zeit in Anspruch nimmt. Der eine mögliche Fall, von dem ich weiß, dass das Drücken von Ctrl+Cerforderlich ist, ist, wenn Sie einen Yum-Aktualisierungsvorgang abbrechen möchten, wobei Yum Ctrl+Czweimal drücken muss , um zu bestätigen, dass Sie den Vorgang wirklich abbrechen möchten.

Nav
quelle
2

Obwohl Ctrl-Cim allgemeinen Fall nur eine erforderlich ist, gibt es einige Situationen, in denen dies erforderlich sein kann. Python fängt beispielsweise ab, Ctrl-Cwenn ein neuer Thread erzeugt wird. Wenn also beim Starten vieler Threads ein Fehler auftritt, muss er mehrmals erneut gesendet werden, damit er den pythonübergeordneten Prozess erreicht, ohne dass er gestartet wird erwischt.

Patrick Collins
quelle
1
Dies passiert mir gelegentlich, wenn ich Multithread- / verarbeitete Python-Skripte erstelle. Manchmal sind mehrere Pressen erforderlich, bevor der Hauptprozess beendet wird.
Leo
0

Ich muss immerCtrlc mehrmals drücken . Ich habe noch nie eine Antwort auf die erste Druckmaschine erhalten und muss sie mehrmals verwenden, bis das System tatsächlich feststellt, dass eine CtrlcNachricht gesendet wird. Scheint, als ob es tatsächlich die meisten von ihnen verfehlt / verliert.

user280568
quelle