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

82

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

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

    
задан chaitanya lakkundi 13.08.2014 в 13:50
источник

6 ответов

110

Если мы оставляем граничные случаи в одну сторону, разница проста. Control + C прерывает приложение почти сразу, а Control + Z шунтирует его в фоновом режиме, приостановлено.

Оболочка посылает различные сигналы в базовые приложения в этих комбинациях:

  • Элемент управления + 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, который находится в столбце состояния), что процесс был остановлен , Так что он все еще жив, но он не работает ... Его можно возобновить.

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

ответ дан Oli 13.08.2014 в 13:56
источник
13

Control + Z приостанавливает процесс ( SIGTSTP ) и Control + C прерывает процесс ( SIGINT )

Ссылка

  

В Unix-подобных системах Control + Z является наиболее распространенным по умолчанию сопоставлением клавиатуры для последовательности клавиш, которая приостанавливает процесс

Ссылка

  

В системах POSIX последовательность приводит к тому, что активная программа получает сигнал SIGINT. Если программа не указала, как обрабатывать это условие, она прекращается. Как правило, программа, которая обрабатывает SIGINT, по-прежнему завершает себя или, по крайней мере, завершает задачу, запущенную внутри нее

    
ответ дан Sleep Deprived Bulbasaur 13.08.2014 в 13:56
8

Ctrl + C используется для уничтожения процесса с сигналом SIGINT , другими словами, это вежливый kill .

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

Однако, когда процесс приостановлен, мы можем возобновить его снова fg (resume in forground) и bg (resume in background) , но я не могу возобновить убитый процесс, то есть разницу между использованием Ctrl + C & amp; CTRL + Z .

Как просмотреть приостановленный процесс?

С помощью команды jobs вывод будет:

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

Как убить приостановленный процесс в фоновом режиме?

Используя команду kill :

kill% n , где n будут отображаться номера в команде заданий, поэтому я хочу убить cat: kill %1 .

    
ответ дан nux 14.08.2014 в 07:49
6

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

  

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

    
ответ дан Graham 13.08.2014 в 13:58
3

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

ответ дан P_O_I_S_O_N 14.08.2014 в 07:24
3

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

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

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

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

ответ дан thomasrutter 15.08.2014 в 00:39