чому введення Ctrl + c двічі зупинить запущений процес в Linux?


24

Є програми Linux, наприклад vlc, які рекомендують набрати ctrl+ cдва рази, щоб знищити їх виконання з терміналу, якщо програма не зупинилася після першої.

Чому друкувати ctrl+ cдвічі працювати, коли перший раз не працював?


6
[потрібна цитата]
Ігнасіо Васкес-Абрамс

Відповіді:


35

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

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


3
У деяких системах сигнал повертається до SIG_DFL після виклику обробника (щоб уникнути виклику обробника двічі за одним і тим же сигналом); це називається семантикою SysV. Багато програм не повертають обробник сигналу до початкових налаштувань програми в кінці обробника. Це, як правило, помилка програмування. Детальніше про сигнальну (2) сторінку .
Арседж

16

SIGINT , сигнал, що надсилається Ctrl+ C, умовно вказує програмі вийти на основний цикл обробки команд, або, якщо це не має сенсу, чисто вийти. Деякі програми виконують процедуру очищення, коли вони отримують SIGINT. Якщо програма настільки заплутана, що процедура очищення не вдається, у деяких програмах секунда Ctrl+ Cзмушує програму негайно вийти з програми. Це буде вирішувати кожен автор програми.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.