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 edsolo 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 edsimplemente aceptara ser interrumpido.
Otro programa obstinado que exhibe un comportamiento similar es el lessque 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.
edoriginalmente 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.
edEsto 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.ctiene 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.ces 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
SIGINTse 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, laedinstancia. 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 queedfuente
Hay tres señales que
edle importan:INTHUPQUITLa especificación POSIX de
eddice lo siguiente acerca de estos:Entonces, cualquier implementación
edque esté utilizando, se ajusta a la especificación POSIX con respecto a laINTseñ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
INTseñal. Otros editores, comoviynanohace lo mismo.fuente
edque tengo disponibles. Se comporta de manera similar al shell, que tampoco termina al recibir laINTseñal.