Чи натискання клавіші ctrl-c кілька разів змушує запускається програму швидше закриватися?


41

Я часто починаю читати величезний файл, а потім хочу вийти через деякий час, але є відставання від натискання
Ctrl+ Cдо зупинки програми. Чи є ймовірність скоротити відставання натисканням клавіші Ctrl+ Cкілька разів? Або я витрачаю свої натискання клавіш?


Я помітив, коли запускається процес, який викликає різні дочірні процеси, Ctrl-C іноді перериває працюючу дитину, але не батьківський процес. Це вірно bash, але не той випадок, zshколи батьків завжди закриває. Це одна з причин, які мені подобаються zsh.
joeytwiddle

17
Так, так само, як натискання кнопки ліфта або кнопка перехресного прогулянки неодноразово призведе до того, що ліфт стане швидшим, або світло швидше зеленеє.
Майкл

3
Так, як і кнопки ліфтів та пішохідних переходів, CTRL-C також може стати клейким або іржавим або розвинути iffy з'єднання. Натискання більше разів - хороша тактика, тому що лише один натиск повинен зареєструватися для підйому ліфта, знака прогулянки загорітися або програми закрити.
hippietrail

1
@hippietrail, але ваша оболонка буде роздруковуватися, ^Cколи вона реєструє пресу (принаймні, баш робить)
wchargin

1
Що я того вартий, я не вважаю, що витрачає свої натискання клавіш - я вважаю, що це відпускає розчарування без шкоди. (Я зазвичай натискаю на нього 2-3 рази, але це частково тому, що я "виріс" на терміналах, приєднаних по телефонних лініях, де ви не завжди могли розраховувати на кожен натискання клавіші, що дійшов до машини.)
keshlam

Відповіді:


35

Після першого Ctrl-Cпрограма отримає SIGINTі зазвичай починає очищення (видалення файлів tmp, закриття сокетів тощо). Якщо ви Ctrl-Cзнову натиснете, поки це відбувається, може статися, що ви порушите процедуру очищення (тобто додатковий сигнал може діяти замість того, щоб залишити його в спокої), залишивши безлад. Хоча зазвичай це не так, частіше додаткові сигнали насправді надсилаються післяпроцес закінчений (через властиві затримки взаємодії оператора з системою). Це означає, що сигнали приймаються іншим процесом (часто оболонкою, але не завжди). Якщо цей одержувач не справляється з цим сигналом належним чином (як це робиться оболонка - див. Відповідь Дженні Д), ви можете бути неприємно здивовані результатом такої дії.


Чому слід переривати розпорядок очищення? Це просто ще один сигнал, INTякий отримує процес.
хаос

4
@chaos Чому це потрібно? Це повинно бути, якщо розпорядок очищення завис, і ви хочете його припинити. Це насправді працює таким чином? Так, досить часто. Ви можете продемонструвати це досить просто: зробіть сценарій bash з одним рядком trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10. Запустіть сценарій і двічі натисніть ctrl-C. Ви побачите, що другий ctrl-C передається в режим очищення (в операції trap) і припиняє свою sleepкоманду.
John1024

1
@ John1024 Ага, тепер я це бачу. Дякуємо за фрагмент сценарію ^^ Але очищення не скасовується див.: Сигнали отримують trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10лише sleepкоманди. Ми обидва помилилися xD
хаос

2
Це неправильно. Подача сигналу є синхронною. Якщо isigувімкнено, як тільки CTRL-C натискається і приймається ядром (для емулятора терміналу, як тільки емулятор термінала записує його на головну сторону псевдотерміналу), сигнал SIGINT надсилається всім процеси в передній план групи процесів терміналу. Він може бути заблокований там, але він не буде доставлений пізніше в інший процес. Навіть якщо буфер термінального пристрою заповнений (додатки не прочитали жодної речі, яку ви ввели), CTRL-C перескочить чергу.
Стефан Шазелас

1
Так, як приклад, VLC інтерпретує декілька Ctrl + C сигналів як спосіб нечистоти, тоді як один Ctrl + C намагатиметься чисто вийти.
Джеремі Віссер

11

Ви їх витрачаєте. Все, що трапляється, полягає в тому, що як тільки сервер закінчить вихід з екрана, він отримає декілька Ctrl-C. Перший буде використаний для вбивства процесу, а наступні опиняться у вашій оболонці, яка буде виглядати приблизно так

[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ 

6
Процес не обов'язково закінчується при надсиланні його SIGINT. Він може залишатися живим нескінченно і робити щось інше кожен раз, коли натискається клавіша Ctrl + C.
Брайан Гордон

Правда. Я робив припущення про те, як користувач читає файл.
Дженні Д

5

Коротка відповідь: Якщо процес на це реагує.

Довга відповідь: Коли ви натискаєте ctrl+, cядро надсилає сигнал процесу. Який сигнал можна визначити за допомогою наступної команди:

user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;

Дивіться сторінку чоловіка stty:

   intr CHAR
          CHAR will send an interrupt signal

Це сигнал INT, також відомий як число 2. Коли процес має обробник сигналу, він може реагувати на це. Більшість процесів виконують деякі роботи з очищення, щоб успішно закінчитися.


Ctrl-Z зазвичай надсилає SIGTSTP, з яким можна обробляти (на відміну від SIGSTOP).
петерф

4
Ні, це не оболонка, яка надсилає SIGINT до процесу. Саме kernel(строкова дисципліна терміналу, драйвер терміналу) посилає SIGINT до кожного процесу в групі процесів переднього плану терміналу.
Стефан Шазелас

Майбутні читачі також дивіться unix.stackexchange.com/a/120071/135943 .
Wildcard

4

Ти правий. Натискання клавіш витрачається даремно. Коли ви натискаєте, Crtl+Cі він виявляється, є ресурси, які потрібно очистити, тому це вимагає часу. Єдиний можливий випадок, з якого я знаю, де Ctrl+Cпотрібно натиснути, - це коли ви хочете скасувати процес оновлення Yum, коли Yum вимагає, щоб ви Ctrl+Cдвічі натискали, щоб підтвердити, що ви дійсно хочете скасувати.


2

Хоча Ctrl-Cв загальному випадку необхідний лише один , є деякі ситуації, коли це може знадобитися. Наприклад, Python вловлює Ctrl-Cпід час породження нової нитки, і тому, якщо щось піде не так, як наслідок запуску багатьох потоків, потрібно повторно повторно надіслати його, щоб він пройшов до pythonбатьківського процесу, не будучи спіймали.


1
Це трапляється зі мною час від часу, коли я створюю багатопотокові / оброблені сценарії python. Іноді до вбивства основного процесу потрібно кілька натискань.
Лев

0

Мені завжди доводиться натискати Ctrlcкілька разів. У мене ніколи не було відповіді під час першого натискання, і я мусив використовувати його кілька разів, поки система фактично не зрозуміє, Ctrlcщо надсилається повідомлення. Здається, він насправді пропускає / втрачає більшість із них.

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