Por que o Ctrl + \ (barra invertida) não mata mais o processo?

5

Por um tempo, Ctrl + \ funcionou como um encanto. Agora, isso não mata o processo. Na verdade, não faz nada.

Um exemplo de como isso NÃO funciona:

adi@ebi:~ $ sleep 10
^C

[exited with 130]
adi@ebi:~ $ sleep 10
^\^\^\^\^\^\^\^\^\^\^\ 
adi@ebi:~ $
Ctrl + C pára de dormir como de costume, mas Ctrl + \ não, mas deveria, certo?

    
por agroszer 04.09.2013 / 11:20

2 respostas

5

O que Ctrl + \ faz é enviar SIGQUIT para o processo em primeiro plano. Alguns desenvolvedores querem usar eventos SIG * de uma maneira que o usuário não espere ou esteja acostumado. Você não mencionou o programa, mas vamos ver meu caso com Ctrl + \ e mplayer :

AO: [pulse] 44100Hz 2ch floatle (4 bytes per sample)
Video: no video
Starting playback...
A:   1.7 (01.7) of 0.0 (unknown)  0.4% 
// here I press Ctrl + \

MPlayer interrupted by signal 3 in module: play_audio
A:   1.0 (00.9) of 0.0 (unknown)  0.4% 

Exiting... (Quit)

Como você pode ver, o mplayer captura o sinal, mas não sai imediatamente. Se eu tivesse usado Ctrl + C , ele diria "MPlayer interrompido pelo sinal 2 no módulo: play_audio" . O que estou tentando explicar é que cada programa pode interpretar os sinais da maneira que eles gostam, sem se importar com o que é suposto fazer. Você deve revisar a documentação. Além disso, lembre-se de que SIGKILL ou 9 deve ser utilizado como último recurso. Você deve verificar se os pressionamentos de teclas também são enviados para o processo, se o mapa de teclas está correto e se o teclado está conectado.

    
por Braiam 27.08.2013 / 18:22
1

Você pode listar suas configurações de terminal executando

stty -a

Ele imprimirá suas teclas de atalho, onde "^" significa CTRL, por exemplo, o meu é:

intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O;

Verifique man stty para ver qual caractere especial faz o que, por exemplo:

quit CHAR
          CHAR will send a quit signal

Então " quit = ^ \ " na minha saída significa que se eu pressionar CTRL + \, ele enviará um sinal de saída ( SIGQUIT ) para o processo. Se sua saída stty -a for diferente, você poderá configurá-la com

stty quit ^\

ou se você quiser, por exemplo CTRL + K para o uso do sinal SIGQUIT

stty quit ^k

Mas observe que todos os sinais, exceto o SIGKILL , podem ser capturados pelo processo de recebimento para que o processo possa ignorá-lo, caso o desenvolvedor tenha decidido fazê-lo. E também acho que usar CTRL + c (SIGINT) é melhor que usar CTRL + \ (SIGQUIT), porque a ação padrão para ambos os sinais é finalizar o processo mas no caso de SIGQUIT um coredump também deve ser feito, o que eu acho geralmente não é desejado.

    
por falconer 04.12.2013 / 12:53

Tags