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

Это не поддерживается out-of-the-box ни на каком Unix, который я знаю, но можно сделать в значительной степени что-либо с FUSE. Существует по крайней мере одна реализация nullfs ¹, файловая система, где каждый файл существует и ведет себя как /dev/null (это не единственная реализация, которую я когда-либо видел).

¹, чтобы Не быть перепутанным с *BSD nullfs, который походит на bindfs.

24
21.08.2011, 23:47
2 ответа

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

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

35
27.01.2020, 19:40
  • 1
    В некоторых системах сигнал вернулся к SIG_DFL после вызова к обработчику (чтобы не называть обработчик дважды на том же сигнале); это называют семантикой SysV. Много программ не задерживают обработчик сигналов к исходным настройкам на программе в конце обработчика. Это обычно было бы ошибкой программирования. Считайте больше информации о странице справочника сигнала (2). –  Arcege 21.08.2011, 21:24

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

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

16
27.01.2020, 19:40

Теги

Похожие вопросы