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?
41
bash
, aber nicht der Fall, inzsh
dem immer der Elternteil schließt. Das ist einer der Gründe, die ich magzsh
.^C
wenn es die Presse registriert (zumindest Bash tut)Antworten:
Nach der ersten Ctrl-Cwird das Programm empfangen
SIGINT
und 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.quelle
INT
, das der Prozess erhält.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 ihrensleep
Befehl beendet .trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10
Es sind nur diesleep
Befehle, die die Signale erhalten. Wir waren beide falsch xDisig
ist, 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.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
quelle
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:
Siehe die Manpage von
stty
: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.quelle
kernel
(die Linie Disziplin des Terminals, die Terminal - Treiber) , die SIGINT zu jedem Prozess im Vordergrund Prozess sendet Gruppe des Terminals.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.
quelle
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.quelle
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.
quelle