El programa ed
, un editor de texto mínimo, no se puede salir mediante el envío de una interrupción a través del uso Ctrl- C"?", En lugar de imprimir el mensaje de error a la consola ¿Por qué no ed
solo sale cuando recibe la interrupción? Seguramente no hay ninguna razón por la cual un mensaje de error críptico sea más útil aquí que simplemente salir. Este comportamiento lleva a muchos usuarios nuevos al siguiente tipo de interacción:
$ ed hello ? help ? exit ? quit ? ^C ? ^C ? ? ? ^D $ su # rm -f /bin/ed
Un desperdicio tan trágico, fácilmente evitable si ed
simplemente aceptara ser interrumpido.
Otro programa obstinado que exhibe un comportamiento similar es el less
que tampoco parece tener muchas razones para ignorar C-c
. ¿Por qué estos programas simplemente no dan una pista?
Respuestas:
Ctrl+ Cenvía SIGINT . La acción convencional para SIGINT es regresar al ciclo de nivel superior de un programa, cancelando el comando actual y entrando en un modo en el que el programa espera el siguiente comando. Se supone que solo los programas no interactivos deben morir de SIGINT.
Por lo tanto, es natural que Ctrl+ Cno mate a ed, sino que haga que regrese a su ciclo de nivel superior. Ctrl+ Caborta la línea de entrada actual y vuelve a la línea de comandos ed.
Lo mismo ocurre con menos: Ctrl+ Cinterrumpe el comando actual y lo regresa a su símbolo del sistema.
Por razones históricas, ed ignora SIGQUIT ( Ctrl+ \). Las aplicaciones normales no deberían captar esta señal y permitir que se terminen, con un volcado de núcleo si está habilitado.
fuente
El código fuente de Unix V7
ed(1)
es un programa primitivo de 1.762 líneas C con solo unos pocos comentarios, uno de los cuales es este comentario de encabezado muy esclarecedor:Dado que el código fuente en sí no proporciona ninguna justificación, solo lo obtendrá del autor del programa.
ed
originalmente fue escrito por Ken Thompson en el ensamblaje PDP-11 , pero en realidad necesitarías hablar con quien lo haya portado a C. Ese podría haber sido Dennis Ritchie , ya que creó C para Unix, y fue uno de los muchos que usaron C hacer que Unix sea portátil para máquinas que no sean PDP. Sin embargo, el Dr. Ritchie ya no está cerca para responder esas preguntas.Mi lectura del código sugiere que se ha hecho para tratar de preservar el contenido de la en-core copia del documento editado. Notarás que otros editores de texto tampoco mueren Ctrl-C.
ed
Esto es lo que hace en Ctrl-C:(Sí, K&R C. No necesitamos especificadores de tipo de retorno de steenkin ni declaraciones de parámetros).
Traducido al inglés
ed
,:Vuelve a registrar el controlador de señal.
(Unix no recibió señales de reinicio automático hasta 4.3BSD , a mediados de la década de 1980).
Escribe una nueva línea y recuerda que lo hizo a través de la variable global
lastc
.(
ed.c
tiene alrededor de sesenta variables globales).Llama a la
error()
función, que famoso no hace más que imprimir?
, desde la perspectiva del usuario.En otras palabras, dice: "Realmente no quisiste hacer eso, ¿verdad?"
fuente
error(s)
ened.c
es volver al bucle de procesamiento principal. Lo hace con unalongjmp()
llamada. estremecimientoed
, como otros programas interactivos, use Ctrl+ Cpara interrumpir las tareas del programa en sí.Esto es muy similar al caso normal, donde interrumpe una tarea que se ejecuta en el shell: un comando.
Desde la perspectiva del usuario, ambas variantes son muy similares. El manejo de la señal es diferente: en el caso habitual, la señal
SIGINT
se envía al proceso en primer plano, a un comando en ejecución, y el comando la maneja al salir.En el caso de
ed
, la señal se envía al proceso de primer plano, laed
instancia. Si hay una tarea ejecutándoseed
, se interrumpe y se muestra el mensaje. Si no hay ninguna tarea en ejecución, no se cambia nada.Tenga en cuenta que un shell tampoco sale en Ctrl+ C, al igual que
ed
. Y que sí sale en Ctrl+ D. De nuevo, al igual queed
fuente
Hay tres señales que
ed
le importan:INT
HUP
QUIT
La especificación POSIX de
ed
dice lo siguiente acerca de estos:Entonces, cualquier implementación
ed
que esté utilizando, se ajusta a la especificación POSIX con respecto a laINT
señal (que es lo que Ctrl+Cenvía).En este sentido, el editor se comporta como un shell interactivo, que tampoco termina al recibir la
INT
señal. Otros editores, comovi
ynano
hace lo mismo.fuente
ed
que tengo disponibles. Se comporta de manera similar al shell, que tampoco termina al recibir laINT
señal.