Pressionar ctrl-c várias vezes torna o programa em execução mais rápido?

41

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?

The Unfun Cat
fonte
Notei que, ao executar um processo que chama vários processos filhos, o Ctrl-C às vezes interrompe o filho em execução, mas não o processo pai. Isso é verdade bash, mas não é o caso em zshque sempre fecha o pai. Essa é uma das razões pelas quais eu gosto zsh.
precisa saber é o seguinte
17
Sim, assim como pressionar o botão do elevador ou o botão cross-walk repetidamente fará com que o elevador chegue mais cedo ou a luz fique verde mais rápido.
Michael Michael
3
Sim, assim como os botões do elevador e da faixa de pedestres, o CTRL-C também pode ficar pegajoso ou enferrujado ou desenvolver conexões duvidosas. Pressionar mais vezes é uma boa tática, porque apenas uma imprensa precisa se registrar para o elevador chegar, o sinal de caminhada acender ou o programa para fechar.
precisa saber é o seguinte
1
@hippietrail mas o seu shell irá imprimir ^Cquando se registra a imprensa (pelo menos o bash faz)
wchargin
1
Pelo que vale a pena, não considero desperdiçar minhas teclas - considero exalar alguma frustração de maneira não prejudicial. (Eu costumo bater-lo 2-3 vezes, mas isso é parcialmente porque eu "cresceu" terminais ligados através de linhas telefônicas em que você não pode sempre contar com cada tecla única atingindo a máquina.)
keshlam

Respostas:

35

Após o primeiro Ctrl-C, o programa receberá SIGINTe 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.

John1024
fonte
Por que deveria interromper a rotina de limpeza? É apenas mais um sinal INTque o processo recebe.
caos
4
@chaos Por que deveria? Deveria se a rotina de limpeza foi interrompida e você deseja interrompê-la. Realmente funciona dessa maneira? Sim, com bastante frequência. Você pode demonstrá-lo simplesmente: faça um script bash com a única linha 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 seu sleepcomando.
precisa saber é o seguinte
1
@ John1024 Ah, agora eu vejo. Obrigado pelo trecho de script ^^ Mas, a limpeza não é cancelada, consulte: trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10São apenas os sleepcomandos que recebem os sinais. Nós dois estávamos errados xD
caos
2
Isso está incorreto. A entrega do sinal é síncrona. Se isigestiver 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.
Stéphane Chazelas
1
Sim, como exemplo, o VLC interpreta vários sinais Ctrl + C como uma maneira de sair de maneira impura, enquanto um único Ctrl + C tenta sair de forma limpa.
Jeremy Visser
11

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

[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ 
Jenny D
fonte
6
O processo não termina necessariamente ao enviar um SIGINT. Ele pode permanecer vivo indefinidamente e fazer algo diferente toda vez que Ctrl + C é pressionado.
Brian Gordon
Verdade. Eu estava fazendo suposições sobre como o usuário está lendo o arquivo.
Jenny D
5

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:

user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;

Veja a página de manual de stty:

   intr CHAR
          CHAR will send an interrupt signal

É 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.

caos
fonte
Ctrl-Z normalmente envia SIGTSTP que pode ser manipulado (ao contrário de SIGSTOP).
Peterph
4
Não, não é o shell que envia o SIGINT ao processo. É a 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.
Stéphane Chazelas
Futuros leitores, consulte também unix.stackexchange.com/a/120071/135943 .
Wildcard
4

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.

Nav
fonte
2

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 pythonprocesso pai sem ser apanhado.

Patrick Collins
fonte
1
Isso acontece comigo de vez em quando quando crio scripts python multiencadeados / processados. Às vezes, são necessárias várias impressoras antes que o processo principal seja interrompido.
Leo
0

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.

user280568
fonte