Por que o ed não pode ser encerrado com C-c?

18

O programa ed , um editor de texto mínimo, não pode ser encerrado enviando-lhe uma interrupção usando Ctrl - C , imprimindo a mensagem de erro "?" para o console. Por que o ed não sai apenas quando recebe a interrupção? Certamente não há razão para que uma mensagem de erro oculta seja mais útil aqui do que apenas sair. Esse comportamento leva muitos novos usuários para o seguinte tipo de interação:

$ ed
hello
?
help
?
exit
?
quit
?
^C
?
^C
?
?
?
^D
$ su
# rm -f /bin/ed

Um desperdício tão trágico - facilmente evitável se ed simplesmente concordar em ser interrompido.

Outro programa teimoso que exibe um comportamento semelhante é less , o que também não parece ter muitos motivos para ignorar C-c . Por que esses programas não dão uma pista?

    
por ikdc 17.08.2014 / 02:25

4 respostas

17

Ctrl + C envia SIGINT . A ação convencional para SIGINT é retornar ao loop de nível superior de um programa, cancelando o comando atual e inserindo um modo em que o programa aguarda o próximo comando. Apenas programas não-interativos supostamente morrem no SIGINT.

Portanto, é natural que Ctrl + C não elimine ed, mas faça com que ele retorne ao seu loop de nível superior. Ctrl + C anula a linha de entrada atual e retorna ao prompt ed.

O mesmo vale para menos: Ctrl + C interrompe o comando atual e traz de volta ao seu prompt de comando.

Por razões históricas, ed ignora SIGQUIT ( Ctrl + \ ). Aplicações normais não devem capturar este sinal e permitir que elas sejam encerradas, com um dump principal, se habilitado.

    
por 17.08.2014 / 03:07
14

O Unix V7 ed(1) código-fonte é um primitivo programa C de 1.762 linhas com apenas alguns comentários, um dos quais é este comentário de cabeçalho altamente esclarecedor:

/*
 * Editor
 */

Dado que o código-fonte em si não fornece nenhuma justificativa, você só vai obtê-lo do autor do programa.

ed foi originalmente escrito por Ken Thompson na montagem do PDP-11 , mas você Na verdade, eu preciso falar com quem o portou para C. Isso pode ter sido Dennis Ritchie , já que ele criou C para Unix, e foi um dos muitos que usaram o C para tornar o Unix portátil para máquinas não-PDP. O Dr. Ritchie não está mais por perto para responder a essas questões.

A minha leitura do código sugere que foi feito para tentar preservar o conteúdo da cópia do núcleo o documento editado. Você notará que outros editores de texto também não morrem em Ctrl-C .

Veja o que o ed faz em Ctrl-C :

onintr()
{
    signal(SIGINT, onintr);
    putchr('\n');
    lastc = '\n';
    error(Q);
}

(Sim, K & RC . Não precisamos de nenhum tipo de retorno de steenkin ' especificadores ou declarações de parâmetros.)

Traduzido para o inglês, ed :

  1. Registra novamente o manipulador de sinal.

    (o Unix não recebeu sinais de reinicialização automática até o 4.3BSD , em meados dos anos 80.)

  2. Escreve uma nova linha e lembra-se que o fez através da variável global lastc .

    ( ed.c tem cerca de sessenta variáveis globais.)

  3. Chama a função error() , que famosa faz pouco mais que imprimir ? , da perspectiva do usuário.

Em outras palavras, está dizendo: "Você não queria fazer isso, sabia?"

    
por 17.08.2014 / 02:54
6

ed , como outros programas interativos, use Ctrl + C para interromper tarefas do próprio programa.
Isso é muito semelhante ao caso normal, onde ele interrompe uma tarefa em execução no shell - um comando.

Da perspectiva do usuário, ambas as variantes são muito semelhantes. O tratamento do sinal é diferente: no caso normal, o sinal SIGINT é enviado para o processo em primeiro plano, um comando em execução e o comando o manipula saindo. No caso de ed , o sinal é enviado para o processo em primeiro plano, a instância ed . Se houver uma tarefa em execução em ed , ela será interrompida e o prompt será mostrado. Se não houver nenhuma tarefa em execução, nada será alterado.

Note como um shell também não sai em Ctrl + C , como ed . E isso sai em Ctrl + D . Novamente, assim como ed

    
por 17.08.2014 / 03:01
2

Existem três sinais com os quais ed se preocupa:

  1. INT
  2. HUP
  3. QUIT

A especificação POSIX de ed diz o seguinte sobre estes:

SIGINT

The ed utility shall interrupt its current activity, write the string ?\n to standard output, and return to command mode (see the EXTENDED DESCRIPTION section).

SIGHUP

If the buffer is not empty and has changed since the last write, the ed utility shall attempt to write a copy of the buffer in a file. First, the file named ed.hup in the current directory shall be used; if that fails, the file named ed.hup in the directory named by the HOME environment variable shall be used. In any case, the ed utility shall exit without writing the file to the currently remembered pathname and without returning to command mode.

SIGQUIT

The ed utility shall ignore this event.

Portanto, qualquer que seja a implementação de ed que você está usando, ela está em conformidade com a especificação POSIX com relação ao sinal INT (que é o que Ctrl + C envia).

Nesse sentido, o editor se comporta como um shell interativo, que também não termina ao receber o sinal INT . Outros editores, como vi e nano , fazem a mesma coisa.

    
por 08.05.2018 / 10:35