Чем отличаются Ctrl + Z и Ctrl + C в командной строке Unix?

181

Я использую Mac OS X Terminal. И я пользуюсь Ctrl + Z или же Ctrl + С остановить некоторые программы. Но я понял, что не знаю, что именно они делают. Каковы они и в чем разница между ними?

Этот вопрос был Вопрос Супер пользователя недели ,
Читайте 13 марта 2011 запись в блоге для более подробной информации или представить свой Вопрос недели.

Eonil
источник

Ответы:

240

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

Если вы приостановите процесс, он появится в оболочке и сообщит вам, что он был приостановлен:

[1]+  Stopped                 yes

Однако, если вы убьете его, вы не увидите никакого подтверждения, кроме как вернуться к приглашению оболочки. Когда вы приостанавливаете процесс, вы также можете делать с ним что-то необычное. Например, запустив это:

fg

С приостановленной программой вернет ее на передний план.

И работает команда

bg

Если программа приостановлена, она будет работать в фоновом режиме (однако выходная информация программы все равно будет передаваться в TTY).

Если вы хотите убить приостановленную программу, вам не нужно возвращать ее с fg во-первых, вы можете просто выполнить команду:

kill %1

Если у вас есть несколько приостановленных команд, выполняется

jobs

перечислю их, вот так:

[1]-  Stopped                 pianobar
[2]+  Stopped                 yes

С помощью %#, где # номер задания (тот, что в квадратных скобках от jobs выход) с bg, fg, или же kill, может быть использован для выполнения действий на этой работе.

Wuffers
источник
3
Вы можете изменить, какие клавиши выполняют какую работу, используя stty команда. Например stty susp ^Z или же stty intr ^C,
RedGrittyBrick
7
На самом деле, он отправляет SIGTSTP, который может быть перехвачен.
Simon Richter
2
Здорово! Итак, если программа отказывается умереть с помощью Ctrl + C, как вы заставляете ее убивать?
Aditya M P
2
@adityamenon Найдите имя исполняемого файла, например amarok и беги killall amarokили беги ps aux и найдите идентификатор процесса рядом с именем исполняемого файла и запустите kill {process id},
Bruno Finger
22

Ctrl + Z приостанавливает процесс с помощью SIGTSTP, вы можете возобновить его позже. Ctrl + C убивает процесс с помощью SIGINT, который завершает процесс, если он не обработан / проигнорирован целью, поэтому вы не можете возобновить его. Также есть SIGSTOP, который может быть отправлен kill() и который процесс не может перехватить. SIGCONT является аналогом SIGSTOP и SIGTSTP, который приостанавливает процесс.

Ben Voigt
источник
Нет, это SIGTSTP, а не SIGSTOP, и его можно перехватить.
sch
@ щ, теперь это правильно?
Ben Voigt
Да, хотя Ctrl-Z (и CTRL-C) вызывает процесс группа (группа процессов переднего плана терминала), чтобы принимать этот сигнал, не обязательно только один процесс. Также обратите внимание, что SIGTTIN и SIGTTOU отправляются процессам, не входящим в группу процессов переднего плана терминала, когда затем пытаются читать или записывать из него / в него, что также приостанавливает их.
sch
@sch: Разве процесс и группа не только разница в том, как сигнал отправляется? IIRC kill() позволяет отправить SIGSTOP группе просто отлично.
Ben Voigt
Да, моя команда была о вашем CTRL-Z приостанавливает процесс ... что может ввести в заблуждение людей, думая, что это отправляется только один процесс, когда это на самом деле работа или же группа процессов ,
sch
17

CTRL + Z останавливает (приостанавливает) работу

CTRL + C прекращает работу

с помощью CTRL + C вы не можете возобновить процесс, но с помощью CTRL + Z можно возобновить работу, просто введя в командной строке:

fg %1

если у вас несколько процессов приостановлено, вы должны сделать

jobs

чтобы увидеть результат и выбрать соответствующий номер для возобновления, например,

fg %3

возобновляет третью работу в списке. Вы также можете работать в фоновом режиме с

bg %n

где n - номер работы.

g24l
источник
Это задания (группы процессов), а не процессы, с которыми работают CTRL-C, CTRL-Z, fg и bg.
sch
3
Cntrl + Z pause the currently running process. 

А также

Cntrl + C simply terminates the running process.

Используя Ctrl + C, вы не можете возобновить процесс. где, используя Ctrl + Z, вы можете возобновить процесс.

используйте fg% 1 для возобновления процесса.

Ravindra Miyani
источник
3

CTRL + Z останавливает (делает паузу) работу

CTRL + С прекращает работу

С CTRL + С Вы не можете возобновить процесс, но с CTRL + Z задание можно возобновить, просто введя в командной строке:

фг% 1

Если у вас несколько процессов приостановлено, вы должны сделать

работы

чтобы увидеть результат.

abul
источник
2

Предыдущие ответы верны, но по какой-то неизвестной причине Ctrl-Z также приостанавливает все дочерние процессы, но killall -SIGSTOP ... только приостанавливает самый передний (родительский) процесс и оставляет дочерние программы для работы по своему усмотрению.

Kostas
источник