Das Programm ed
, ein Minimal-Texteditor, kann nicht durch Senden eines Interrupts mit Ctrl- beendet Cwerden. Stattdessen wird die Fehlermeldung "?" zur Konsole. Warum wird nicht ed
einfach beendet, wenn der Interrupt eingeht? Sicher gibt es keinen Grund, warum eine kryptische Fehlermeldung hier nützlicher ist als nur zu beenden. Dieses Verhalten führt viele neue Benutzer zu der folgenden Art von Interaktion:
$ ed hello ? help ? exit ? quit ? ^C ? ^C ? ? ? ^D $ su # rm -f /bin/ed
Solch eine tragische Verschwendung - leicht vermeidbar, wenn ed
einfach zugestimmt wird, unterbrochen zu werden.
Ein anderes hartnäckiges Programm, das ein ähnliches Verhalten aufweist less
, scheint auch nicht viel Grund zu haben, es zu ignorieren C-c
. Warum nehmen diese Programme nicht einfach einen Hinweis?
Antworten:
Ctrl+ CSendet SIGINT . Die herkömmliche Aktion für SIGINT besteht darin, zur obersten Schleife eines Programms zurückzukehren, den aktuellen Befehl abzubrechen und in einen Modus zu wechseln, in dem das Programm auf den nächsten Befehl wartet. Nur nicht interaktive Programme sollen an SIGINT sterben.
Es ist also natürlich, dass Ctrl+ Ced nicht tötet, sondern zu seiner obersten Schleife zurückkehrt. Ctrl+ Cbricht die aktuelle Eingabezeile ab und kehrt zur Eingabeaufforderung ed zurück.
Gleiches gilt für weniger: Ctrl+ Cunterbricht den aktuellen Befehl und bringt Sie zurück zur Eingabeaufforderung.
Aus historischen Gründen ignoriert ed SIGQUIT ( Ctrl+ \). Normale Anwendungen sollten dieses Signal nicht abfangen und sich beenden lassen, wenn ein Core-Dump aktiviert ist.
quelle
Der Unix V7-
ed(1)
Quellcode ist ein primitives C-Programm mit 1.762 Zeilen und nur wenigen Kommentaren.Da der Quellcode selbst keine Begründung liefert, erhalten Sie ihn nur vom Autor des Programms.
ed
wurde ursprünglich von Ken Thompson in der PDP-11-Assembly geschrieben , aber Sie müssten tatsächlich mit demjenigen sprechen, der es auf C portiert hat. Das könnte Dennis Ritchie gewesen sein , da er C für Unix erstellt hat und einer von vielen, die C früher verwendet haben Unix für Nicht-PDP-Computer portierbar machen. Dr. Ritchie ist jedoch nicht mehr da, um solche Fragen zu beantworten.Das Lesen des Codes legt nahe, dass versucht wurde, den Inhalt der In-Core- Kopie des bearbeiteten Dokuments beizubehalten. Sie werden bemerken, dass auch andere Texteditoren nicht daran sterben Ctrl-C.
Hier ist was
ed
passiert Ctrl-C:(Ja, K & R C. Wir brauchen keine steenkin 'Rückgabetypspezifizierer oder Parameterdeklarationen.)
Übersetzt ins Englische
ed
:Registriert den Signalhandler neu.
(Unix hat erst Mitte der 1980er Jahre mit 4.3BSD Signale zum automatischen Zurücksetzen erhalten .)
Schreibt eine neue Zeile aus und merkt sich dies über die globale Variable
lastc
.(
ed.c
Hat ungefähr sechzig globale Variablen.)Ruft die
error()
Funktion aus der Sicht des Benutzers auf , die bekanntlich kaum mehr als Drucken leistet?
.Mit anderen Worten heißt es: "Das wolltest du doch eigentlich nicht, oder?"
quelle
error(s)
ined.c
ist mit der Hauptverarbeitungsschleife zurück. Dies geschieht mit einemlongjmp()
Anruf. Schaudered
Verwenden Sie, wie bei anderen interaktiven Programmen, Ctrl+, Cum Aufgaben des Programms selbst zu unterbrechen.Dies ist dem normalen Fall sehr ähnlich, in dem eine in der Shell ausgeführte Task unterbrochen wird - ein Befehl.
Beide Varianten sind sich aus Anwendersicht sehr ähnlich. Die Behandlung des Signals ist unterschiedlich: Im Normalfall wird das Signal
SIGINT
an den Vordergrundprozess gesendet, ein ausgeführter Befehl, und der Befehl verarbeitet es durch Beenden.Im Falle von
ed
wird das Signal an den Vordergrundprozeß dered
Instanz gesendet . Wenn eine Aufgabe ausgeführt wirded
, wird sie unterbrochen und die Eingabeaufforderung angezeigt. Wenn keine Aufgabe ausgeführt wird, wird nichts geändert.Beachten Sie, wie eine Shell auch nicht auf Ctrl+ beendet Cwird
ed
. Und dass es auf Ctrl+ beendet D. Wieder wieed
quelle
Es gibt drei Signale, die
ed
wichtig sind:INT
HUP
QUIT
In der POSIX-Spezifikation von
ed
heißt es dazu:Unabhängig davon, welche Implementierung
ed
Sie verwenden, entspricht sie der POSIX-Spezifikation in Bezug auf dasINT
Signal (welches Ctrl+Csendet).In dieser Hinsicht verhält sich der Editor wie eine interaktive Shell, die auch beim Empfang des
INT
Signals nicht beendet wird . Andere Editoren wievi
und machennano
das Gleiche.quelle
ed
mir vorliegenden Quellen befolgt wird . Es verhält sich ähnlich wie die Shell, die auch beim Empfang desINT
Signals nicht terminiert .