ctrl c против ctrl z с задним планом

26

Ctrl+ Zостанавливает работу, а Ctrl+ Cубивает работу.

Почему это? Разве другой способ не имеет больше смысла?

z@z-lap:~$ sleep 100&
[1] 4458
z@z-lap:~$ sleep 200&
[2] 4459
z@z-lap:~$ jobs
[1]-  Running                 sleep 100 &
[2]+  Running                 sleep 200 &
z@z-lap:~$ fg %1
sleep 100
^Z
[1]+  Stopped                 sleep 100
z@z-lap:~$ jobs
[1]+  Stopped                 sleep 100
[2]-  Running                 sleep 200 &
z@z-lap:~$ fg %1
sleep 100
^C
z@z-lap:~$ jobs
[2]+  Running                 sleep 200 &
neo0
источник
4
"Разве другой способ не имеет больше смысла?" Не могли бы вы указать, почему вы так думаете?
glglgl

Ответы:

55

Я думаю, что вы можете быть смущены насчет записи управления работой. В частности, «Остановлено» означает, что задание все еще живо, но его способность обрабатывать что-либо была сохранена (ему не предоставляется какое-либо время на ЦП для обработки чего-либо). Это фактически состояние «паузы» или «приостановлено», хотя это не правильный технический термин.

  • CtrlCне «останавливает» работу, она отменяет или убивает ее. Технически это приводит к тому, что программе посылается сигнал прерывания, говорящий о том, что она должна прервать свою работу и немедленно выйти из нее. Некоторые программы услышат этот сигнал и выполнят некоторую аварийную очистку перед выходом. Другие не будут отвечать на сигнал и впоследствии просто прерываются.

  • CtrlZс другой стороны, «останавливает» работу. Опять же, это делается с помощью сигнала, но на этот раз это «останов» вместо «прерывания». Это фактически удерживает его и возвращает управление оболочке, но фактически не убивает работу. Если вы хотите, чтобы такая работа продолжалась, вы можете выполнить bgкоманду, чтобы отправить последнее остановленное задание в фоновый режим. Затем он продолжит работу в качестве фонового задания, как если бы вы выполняли его с &самого начала. Вы также можете использовать, fgчтобы возобновить последнее остановленное задание на переднем плане (чтобы оно продолжалось с того места, на котором оно остановилось, и позволяло вам снова взаимодействовать с ним).

Калеб
источник
Я все еще думаю, что Ctrl + Z отправит SIGKILL, а Ctrl + C отправит SIGINIT. Таким образом, Ctrl + Z также убил бы работу. Но из моего примера Ctrl + Z только останавливает работу, как вы сказали. Так что это немного смущает меня.
neo0
10
@ neo0 - может быть, вы привыкли к какой-то странной пользовательской настройке? Вы можете настроить эти вещи - хотя, вероятно, не стоит, если у вас есть приложение, которое полагается на эти карты. Но конфигурация по умолчанию CTRL+C=SIGINTи CTRL+Z=SIGTSTP.
mikeserv
3
Калеб прав (+1). Ctrl-Z останавливает программу, которую вы должны расценивать как «зависание», но эта программа все еще находится в памяти, ее файлы открыты и т. Д. Она не уничтожается / не завершается.
Оливье Дюлак
«Приостановить» может быть яснее, чем «остановить».
Рассел Борогове
1
@jiggunjer Это о форме вещей. Этот ответ дает некоторое представление о том, почему необходимы два шага, а этот вводит некоторые функции, которые делают эти шаги более безболезненными.
Калеб