Почему Ctrl + \ (обратная косая черта) больше не убивает процесс?

5

Некоторое время Ctrl + \ работал как шарм. Теперь он не убивает процесс. На самом деле он ничего не делает.

Пример того, как он НЕ работает:

[email protected]:~ $ sleep 10
^C

[exited with 130]
[email protected]:~ $ sleep 10
^\^\^\^\^\^\^\^\^\^\^\ 
[email protected]:~ $

Ctrl + C останавливает спящий режим, как обычно, но Ctrl + \ нет, но он должен, не так ли?

    
задан agroszer 04.09.2013 в 11:20
источник

2 ответа

5

Что Ctrl + \ отправляет SIGQUIT в процесс переднего плана. Некоторые разработчики хотят использовать события SIG * таким образом, чтобы пользователь не ожидал и не привык. Вы не упомянули о программе, но видите мой случай с Ctrl + \ и 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)

Как вы видите, mplayer поймает сигнал, но не выйдет немедленно. Если бы я использовал Ctrl + C , он сказал бы, что "MPlayer прерывается сигналом 2 в модуле: play_audio" . Я пытаюсь объяснить, что каждая программа может интерпретировать сигналы так, как им нравится, не заботясь о том, что она должна делать. Вы должны просмотреть документацию. Кроме того, помните, что SIGKILL или 9 следует использовать в качестве последнего ресурса. Вы должны проверить, что нажатия клавиш также отправляются в процесс, карта клавиатуры правильная и ваша клавиатура подключена.

    
ответ дан Braiam 27.08.2013 в 18:22
1

Вы можете указать настройки своего терминала, выполнив

stty -a

Он выведет ваши горячие клавиши, где «^» стоит за CTRL, например мой:

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;

Проверить man stty , чтобы увидеть, какой специальный символ выполняет то, что например:

quit CHAR
          CHAR will send a quit signal

Итак, « quit = ^ \ » в моем выпуске означает, что если я нажму CTRL + \, он отправит сигнал завершения ( SIGQUIT ) в процесс. Если ваш stty -a выход отличается, вы можете установить его с помощью

stty quit ^\

или, если хотите, например, CTRL + K для использования сигнала SIGQUIT

stty quit ^k

Но обратите внимание, что каждый сигнал, кроме SIGKILL , может быть захвачен процессом приема, поэтому процесс может игнорировать его, если разработчик решил это сделать. Кроме того, я думаю, что использование CTRL + c (SIGINT) лучше, чем использование CTRL + \ (SIGQUIT), потому что действие по умолчанию для обоих сигналов заключается в завершении процесса, но в случае SIGQUIT также должен быть сделан coredump, который, обычно не нужны.     

ответ дан falconer 04.12.2013 в 12:53