Costumo começar a ler um arquivo enorme e, depois de algum tempo, quero sair, mas há um atraso ao pressionar
Ctrl+ Cpara que o programa pare. Existe uma chance de diminuir o atraso pressionando a tecla Ctrl+ Cvárias vezes? Ou estou desperdiçando minhas teclas?
41
bash
, mas não é o caso emzsh
que sempre fecha o pai. Essa é uma das razões pelas quais eu gostozsh
.^C
quando se registra a imprensa (pelo menos o bash faz)Respostas:
Após o primeiro Ctrl-C, o programa receberá
SIGINT
e normalmente inicia a limpeza (exclusão de arquivos tmp, fechamento de soquetes, etc.). Se você pressionar Ctrl-Cnovamente enquanto isso estiver acontecendo, pode acontecer que você interrompa a rotina de limpeza (ou seja, o sinal adicional pode ser acionado em vez de ser deixado sozinho), deixando uma bagunça para trás. Embora esse geralmente não seja o caso, mais comumente os sinais adicionais são de fato enviados apóso processo foi concluído (devido aos atrasos inerentes na interação do operador com o sistema). Isso significa que os sinais são recebidos por outro processo (geralmente shell, mas nem sempre). Se esse destinatário não manipular esse sinal corretamente (como o shell geralmente faz - veja a resposta de Jenny D), você poderá se surpreender desagradavelmente com o resultado de tal ação.fonte
INT
que o processo recebe.trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10
. Execute o script e pressione ctrl-C duas vezes. Você verá que o segundo ctrl-C é passado para a rotina de "limpeza" (na instrução trap) e finaliza seusleep
comando.trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10
São apenas ossleep
comandos que recebem os sinais. Nós dois estávamos errados xDisig
estiver ativado, assim que o CTRL-C for pressionado e recebido pelo kernel (para um emulador de terminal, assim que o emulador de terminal o grava no lado mestre do pseudo-terminal), o sinal SIGINT é enviado a todos os processos no grupo de processos em primeiro plano do terminal. Pode estar bloqueado lá, mas não será entregue posteriormente para outro processo. Mesmo que o buffer do dispositivo de terminal esteja cheio (os aplicativos não leram nada do que você digitou), o CTRL-C pulará a fila.Você está desperdiçando eles. Tudo o que acontece é que, uma vez que o servidor termine com a saída da tela, ele receberá vários Ctrl-C. O primeiro será usado para matar o processo, e os seguintes acabarão no seu shell, que parecerá algo como
fonte
Resposta curta : se o processo reagir a ele.
Resposta longa : quando você pressiona ctrl+, co kernel envia um sinal para o processo. Qual sinal pode ser determinado pelo seguinte comando:
Veja a página de manual de
stty
:É o sinal
INT
, também conhecido como número 2. Quando o processo tem um manipulador de sinal, ele pode reagir a isso. A maioria dos processos executa alguns trabalhos de limpeza para finalizar com sucesso.fonte
kernel
(a disciplina de linha do terminal, o driver do terminal) que envia o SIGINT para todos os processos no grupo de processos em primeiro plano do terminal.Você está certo. As teclas pressionadas estão sendo desperdiçadas. Quando você pressiona Crtl+Ce é detectado, há recursos que precisam ser limpos, e é por isso que leva tempo. O único caso possível que eu sei onde Ctrl+Cé necessário pressionar é quando você deseja cancelar um processo de atualização do Yum, onde o Yum exige que você pressione Ctrl+Cduas vezes para confirmar que realmente deseja cancelar.
fonte
Embora apenas um Ctrl-Cseja necessário no caso geral, há algumas situações em que pode ser necessário. O Python, por exemplo, intercepta Ctrl-Cquando um novo encadeamento está sendo gerado e, se algo der errado no meio do início de vários encadeamentos, é necessário reenviá-lo várias vezes para que ele chegue ao
python
processo pai sem ser apanhado.fonte
Eu sempre tenho que pressionar Ctrlcvárias vezes. Eu nunca o respondi na primeira impressora e tenho que usá-lo várias vezes até que o sistema realmente perceba que está Ctrlcsendo enviado. Parece que realmente perde / perde a maioria deles.
fonte