Le programme ed
, un éditeur de texte minimal, ne peut pas être quitté en lui envoyant une interruption en utilisant Ctrl- C, en affichant à la place le message d'erreur "?" à la console. Pourquoi ne quitte-t-il pas ed
simplement lorsqu'il reçoit l'interruption? Il n'y a sûrement aucune raison pour laquelle un message d'erreur cryptique est plus utile ici que de simplement quitter. Ce comportement conduit de nombreux nouveaux utilisateurs au type d'interaction suivant:
$ ed hello ? help ? exit ? quit ? ^C ? ^C ? ? ? ^D $ su # rm -f /bin/ed
Un tel gaspillage tragique - facilement évitable s'il est ed
simplement accepté d'être interrompu.
Un autre programme tenace présentant un comportement similaire est celui less
qui ne semble pas non plus avoir beaucoup de raisons d'ignorer C-c
. Pourquoi ces programmes ne prennent-ils pas simplement un indice?
Réponses:
Ctrl+ Cenvoie SIGINT . L'action conventionnelle pour SIGINT consiste à revenir à la boucle de niveau supérieur d'un programme, à annuler la commande en cours et à entrer dans un mode où le programme attend la commande suivante. Seuls les programmes non interactifs sont censés mourir de SIGINT.
Il est donc naturel que Ctrl+ Cne tue pas ed, mais le fasse revenir à sa boucle de niveau supérieur. Ctrl+ Cabandonne la ligne d'entrée actuelle et revient à l'invite ed.
Il en va de même pour moins: Ctrl+ Cinterrompt la commande en cours et vous ramène à son invite de commande.
Pour des raisons historiques, ed ignore SIGQUIT ( Ctrl+ \). Les applications normales ne devraient pas capter ce signal et se permettre d'être interrompues, avec un vidage de mémoire s'il est activé.
la source
Le code source d' Unix V7
ed(1)
est un programme C primitif de 1762 lignes avec seulement quelques commentaires, dont l'un est ce commentaire d'en-tête très instructif:Étant donné que le code source lui-même ne fournit aucune justification, vous ne l'obtiendrez que de l'auteur du programme.
ed
a été initialement écrit par Ken Thompson dans l'assemblage PDP-11 , mais vous auriez en fait besoin de parler à celui qui l'a porté sur C. Cela pourrait être Dennis Ritchie , puisqu'il a créé C pour Unix, et était l'un des nombreux à utiliser C pour rendre Unix portable sur des machines non PDP. Le Dr Ritchie n'est plus là pour répondre à de telles questions.Ma lecture du code suggère qu'il a été fait pour essayer de conserver le contenu de la copie in-core du document édité. Vous remarquerez que d'autres éditeurs de texte ne meurent pas non plus Ctrl-C.
Voici ce que
ed
ça fait Ctrl-C:(Oui, K&R C. Nous n'avons pas besoin de spécificateurs de type de retour steenkin ou de déclarations de paramètres.)
Traduit en anglais
ed
,:Réenregistre le gestionnaire de signaux.
(Unix n'a pas reçu de signaux de réinitialisation automatique avant 4.3BSD , au milieu des années 1980.)
Écrit une nouvelle ligne, et se souvient qu'elle l'a fait, via la variable globale
lastc
.(
ed.c
possède une soixantaine de variables globales.)Appelle la
error()
fonction, qui célèbre ne fait guère plus que la presse écrite?
, du point de vue de l'utilisateur.En d'autres termes, il dit: "Vous ne vouliez pas vraiment faire ça, n'est-ce pas?"
la source
error(s)
ened.c
est de revenir à la boucle principale de traitement. Il le fait avec unlongjmp()
appel. frissoned
, comme d'autres programmes interactifs, utilisez Ctrl+ Cpour interrompre les tâches du programme lui-même.Ceci est très similaire au cas normal, où il interrompt une tâche en cours d'exécution dans le shell - une commande.
Du point de vue de l'utilisateur, les deux variantes sont très similaires. Le traitement du signal est différent: dans le cas habituel, le signal
SIGINT
est envoyé au processus de premier plan, une commande en cours, et la commande le gère en quittant.Dans le cas de
ed
, le signal est envoyé au processus de premier plan, l'ed
instance. Si une tâche est en cours d'exécutioned
, elle est interrompue et l'invite s'affiche. Si aucune tâche n'est en cours d'exécution, rien n'est modifié.Notez comment un shell ne sort pas non plus sur Ctrl+ C, tout comme
ed
. Et qu'il sort sur Ctrl+ D. Encore une fois, tout commeed
la source
Il y a trois signaux qui
ed
importent:INT
HUP
QUIT
La spécification POSIX de
ed
dit ce qui suit à propos de ces éléments:Quelle que soit l'implémentation que
ed
vous utilisez, elle est conforme à la spécification POSIX en ce qui concerne leINT
signal (qui est ce qui Ctrl+Cenvoie).À cet égard, l'éditeur se comporte comme un shell interactif, qui ne se termine pas non plus lors de la réception du
INT
signal. D'autres éditeurs, commevi
etnano
font la même chose.la source
ed
dont je dispose. Il se comporte de manière similaire à la coque, qui ne se termine pas non plus lors de la réception duINT
signal.