почему дважды нажав Ctrl + c, чтобы остановить работающий процесс в Linux?

24

Есть программы для Linux, например, vlc, которые рекомендуют дважды набирать ctrl+, cчтобы завершить их выполнение из терминала, если программа не остановилась после первой.

Зачем печатать ctrl+ cдважды, если первый раз не работает?

719016
источник
6
[нужная цитата]
Игнасио Васкес-Абрамс

Ответы:

35

То, что он делает, полностью зависит от приложения. Когда вы нажимаете ctrl+ c, эмулятор терминала отправляет сигнал SIGINT приложению переднего плана, которое запускает соответствующий «обработчик сигнала». Обработчик сигналов по умолчанию для SIGINT завершает приложение. Но любая программа может установить свой собственный обработчик сигналов для SIGINT (включая обработчик сигналов, который вообще не останавливает выполнение).

Очевидно, vlc устанавливает обработчик сигнала, который пытается выполнить некоторое очищение / постепенное завершение при первом вызове, и возвращается к стандартному поведению немедленного прекращения выполнения, когда он вызывается во второй раз.

Риккардо Мурри
источник
3
В некоторых системах сигнал возвращается к SIG_DFL после вызова обработчика (чтобы не вызывать обработчик дважды для одного и того же сигнала); это называется семантикой SysV. Многие программы не устанавливают обработчик сигнала обратно на исходные настройки программы в конце обработчика. Обычно это будет программная ошибка. Прочитайте больше информации на странице сигнала (2) .
Arcege
16

Сигнал SIGINT , отправляемый Ctrl+ C, обычно указывает программе выйти из основного цикла обработки команд или, если это не имеет смысла, завершиться корректно. Некоторые программы запускают процедуру очистки, когда получают SIGINT. Если программа настолько испорчена, что процедура очистки завершается неудачно, в некоторых программах второй Ctrl+ Cвызывает немедленное завершение программы. Делать это зависит от каждого автора программы.

Если второй Ctrl+ Cне убивает программу, попробуйте Ctrl+ \, который отправляет SIGQUIT , более сильный (но все еще поддающийся обнаружению сигнал), или попробуйте Ctrl+, Zчтобы приостановить программу, а затем killкоманду (например, kill %1которая отправляет SIGTERM , условно менее сильный сигнал). чем SIGQUIT, на работу № 1). Если ничего не помогает , убейте программу kill -KILL, также известную как kill -9отправка неуловимого сигнала SIGKILL .

Жиль "ТАК - перестань быть злым"
источник