В чем разница между Ctrl-z и Ctrl-c в терминале?

120

Может кто-нибудь сказать мне разницу между ctrl+ zи ctrl+ c?

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

Чайтанья Лаккунди
источник
Я задал очень похожий вопрос здесь: unix.stackexchange.com/questions/116959/…
ThorSummoner
да, мне удалось понять разницу между обоими !!
Чайтанья Лаккунди
Я хотел бы добавить одну вещь: большинство парней (и в моем профессиональном кругу) не делают различий между ними. И использовал опцию CTRL-Z для завершения команды. Что является неправильной практикой. Вы должны использовать CTRL-C во всех этих случаях. Как CTRL-Z просто положить в фоновом режиме. Таким образом, процесс не завершается, пока не завершится, что может не быть желанием пользователя (большую часть времени), когда он нажимает CTRL-Z для завершения.
kuldeep.kamboj

Ответы:

156

Если мы оставим крайние случаи в одну сторону, разница будет простой. 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
    

    Кроме того, мы можем видеть (из этого T, который находится в столбце состояния), что процесс был остановлен . Так что он все еще жив, но не работает ... Его можно возобновить.

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

Оли
источник
51
Стоит добавить, что также можно запустить bg(вместо fg) отменить приостановку приложения, которое было Ctrl + Z, без возврата его на передний план; эффективно предоставляя вам контроль как над оболочкой, которая запустила приложение, так и над самим приложением, как если бы вы использовали &при запуске приложения. Это часто бывает полезно, когда вы забыли начать с &:)
Malte Skoruppa
6
И вы можете вернуться к этому процессу, набрав еще fgраз!
sleblanc
4
В случае, если несколько заданий приостановлено или находится в фоновом режиме: список «заданий» перечисляет их, а «fg% n» или «bg% n» или даже «kill% 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, что очень верно; Я чувствовал, что в этом случае определение Википедии было достаточно приличным. Я буду искать больше технических ссылок в будущем, хотя!
Бульбазавр, лишенный сна,
14

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.

Nux
источник
1
в соответствии с другими комментариями в этой теме исправление: ctrl-z отправляет сигнал SIGTSTP, а не SIGSTOP.
почти
Убийство% 1 говорит мне - операция не разрешена. Почему так? Спасибо
Сатья Пракаш
7

Проще говоря:

  • CTRL-C просит, чтобы программа прервалась .

  • CTRL-Z заставляет программу приостанавливаться и уходить в фоновый режим .

    Это позволяет вам возобновить его позже с помощью команды fg. Оставшиеся фоновые задачи убиваются при выходе из оболочки входа в систему.

thomasrutter
источник
5

Это должно помочь

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

Грэхем
источник
4
Это не совсем правильно. Он отправляет SIGTSTP, который может быть пойман программой. Есть четыре различных сигналов, которые могут приостановить программу SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU. Из них только SIGSTOPнельзя заблокировать. Остальные три используются терминалом для остановки процесса при других условиях.
Касперд
4

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

P_O_I_S_O_N
источник