Яка різниця між Ctrl-z і Ctrl-c в терміналі?


120

Хтось може сказати мені різницю між ctrl+ zі ctrl+ c?

Коли я перебуваю в терміналі, обидві комбінації зупиняють поточний процес, але яка саме різниця між обома?


Я задав тут дуже подібне запитання: unix.stackexchange.com/questions/116959/…
ThorSummoner


так, я успішно зрозумів різницю між обома !!
chaitanya lakkundi

Я хочу тут додати одне, що більшість хлопців (і в моєму професійному колі) між ними не розрізняють. І використовував варіант CTRL-Z для припинення команди. Що неправильна практика. Ви повинні використовувати CTRL-C у всіх цих випадках. Як CTRL-Z просто помістити на задній план. Тому процес не припиняється до завершення, що може не бути бажанням користувача (більшість часу), коли він натискає CTRL-Z для припинення.
kuldeep.kamboj

Відповіді:


155

Якщо ми залишимо крайові корпуси в одну сторону, різниця проста. Control+ Cдодаток перериває програму майже негайно, тоді як Control+ Zзнімає його на другий план, призупиняючи

Оболонка надсилає різні сигнали в основні програми на наступні комбінації:

  • Control+ C(символ управління intr) надсилає SIGINT, який перерве програму. Зазвичай викликає його переривання, але це залежить від заявки.

  • Control+ Z(контрольний символ susp) надсилає SIGTSTP до програми переднього плану, фактично розміщуючи його у фоновому режимі, призупинено. Це корисно, якщо вам потрібно вийти з чогось на зразок редактора, щоб перейти та захопити потрібні вам дані. Ви можете повернутися до програми, запустивши fg(або %xде xномер завдання, як показано на рисунку jobs).

    Ми можемо перевірити це, запустивши nano TEST, натиснувши Control+, Zа потім запустивши ps aux | grep TEST. Це покаже нам, що nanoпроцес все ще працює:

    oli     3278  0.0  0.0  14492  3160 pts/4    T    13:59   0:00 nano TEST
    

    Далі ми бачимо (з тієї Т, яка знаходиться у стовпці статусу), що процес зупинено . Отже, він ще живий, але не працює ... Це можна відновити.

    Деякі програми завершаться, якщо вони мають постійні зовнішні процеси (наприклад, веб-запит), які можуть затримати час очікування.


51
Варто додати, що також можна запустити bg(замість fg) відмову від програми, яка була Ctrl + Z'ed, не ставлячи її назад на перший план; ефективно даючи вам контроль над оболонкою, яка запустила програму, і над самою програмою, як ніби ви використовувались &під час запуску програми. Це часто стане в нагоді, коли ви забули почати це з &:)
Malte Skoruppa

6
І ви можете повернутися до цього процесу, ввівши fgще раз!
sleblanc

4
У випадку, якщо кілька завдань призупинено або у фоновому режимі: "завдання" перерахуйте їх, а "fg% n" або "bg% n" або навіть "убийте% n", щоб поставити завдання% n на передній план, фон або вбити його .
Олів'є Дулак

3
@Oli: у вашому другому абзаці написано: «Оболонка надсилає [s]… сигнали до базових програм…» Ні. Операційна система / драйвер терміналу надсилає сигнали. (У системі вікон менеджер вікон може зіграти певну роль.) Крім того, щоб бути повною (хоча виходить за рамки вихідного питання), ви можете згадати Ctrl + \.
Скотт

Як сесія знати , який процес група повинна повернутися на передній план після того, як робити або ctrl cабо ctrl z? Це за замовчуванням для SID (bash)?
jiggunjer

16

Control+ Zпризупиняє процес ( SIGTSTP) і Control+ Cперериває процес ( SIGINT)

http://en.wikipedia.org/wiki/Control-Z

У системах, схожих на Unix, Control + Z є найпоширенішим відображенням клавіатури за замовчуванням для послідовності клавіш, яка призупиняє процес

http://en.wikipedia.org/wiki/Control-C

У системах POSIX послідовність призводить до того, що активна програма отримує сигнал SIGINT. Якщо програма не вказує, як впоратися з цією умовою, її припиняють. Зазвичай програма, яка обробляє SIGINT, все одно припинить себе або принаймні припинить завдання, що працює всередині неї


1
Хороші довідники про роботу. Але загалом кажучи, Вікіпедія не є дуже хорошим джерелом для технічного посилання.
Аарон

3
@ BryceAtNetwork23, що дуже правда; Я вважав, що в цьому випадку визначення Вікіпедії було гідно достатнім. Я буду шукати більше технічних посилань у майбутньому, хоча!
Сон позбавлений Бульбазаур

13

Ctrl+ Cвикористовується для вбивства процесу із сигналом SIGINT, іншими словами - це ввічливе вбивство .

Ctrl+ Z використовується для призупинення процесу, надсилаючи йому сигнал SIGTSTP, подібний до сигналу сну, який можна скасувати, і процес можна відновити знову.

Однак, коли процес призупинено, ми можемо відновити його знову fg(відновити на передньому плані) та bg(відновити у фоновому режимі), але я не можу відновити вбитий процес, це різниця між використанням Ctrl+ C& Ctrl+ Z.

Як ми можемо переглянути призупинені процеси?

jobsКоманда дає такий висновок:

[1]-  Stopped                 cat
[2]+  Stopped                 vi

Як вбити призупинений процес у фоновому режимі?

За допомогою killкоманди:

kill %nде nчисло, відображене jobsкомандою. Тож якщо я хочу вбити кота : kill %1.


1
відповідно до інших коментарів у цій темі, виправлення: ctrl-z посилає сигнал SIGTSTP, а не SIGSTOP.
lukewendling

Вбивство% 1 мені каже - Операція заборонена. Чому так? Спасибі
Сатя Пракаш

7

Простіше кажучи:

  • CTRL-C запити, щоб програма перервала .

  • CTRL-Z змушує програму призупинитися і відійти на другий план .

    Це дозволяє відновити його пізніше за допомогою команди fg. Залишилися фонові завдання вбиваються при виході з оболонки входу.


5

Це має допомогти

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


4
Це не зовсім правильно. Він надсилає SIGTSTP, яку може спіймати програма. Є чотири різних сигналів, які можуть призупинити програму SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU. З них лише SIGSTOPнеможливо заблокувати. Інші три використовуються терміналом для зупинки процесу в різних умовах.
kasperd

4

коли ви натискаєте ctrl+ c, це означає, що ви надсилаєте SIGINT до свого процесу. як ви вводите наступну команду: kill -SIGINT <your_pid>. Це вб'є вам ваш процес. Ось чому ви його не бачите при видачі команди ps .
Коли ви натискаєте ctrl+ z, це означає, що ви відправляєте SIGSTOP у ваш процес. як ви вводите наступну команду: kill -SIGKSTOP <your_pid>. Це зупинить ваш процес, але процес все ще живий. Таким чином, ви можете знову активувати процес, надіславши SIGCONT до свого процесу.

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