Що відрізняється між Ctrl + Z і Ctrl + C у командному рядку Unix?


188

Я використовую Mac OS X Terminal. І я використовую Ctrl+ Zабо Ctrl+, Cщоб зупинити деякі програми. Але я зрозумів, що не знаю, що саме вони роблять. Які вони і в чому різниця між ними?

Це питання було питанням суперкористувача тижня .
Прочитайте запис у блозі 13 березня 2011 року, щоб отримати докладнішу інформацію або подати власне запитання тижня.

Відповіді:


250

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

Якщо ви призупинили процес, він відобразиться в оболонці, щоб повідомити, що його призупинено:

[1]+  Stopped                 yes

Однак, якщо ви вб'єте одного, ви не побачите ніякого підтвердження, окрім як повернутись до підказки оболонки. Якщо ви призупинили процес, ви також можете робити і фантазійні речі. Наприклад, запустивши це:

fg

Якщо призупинена програма поверне її на перший план.

І працює команда

bg

Якщо призупинена програма дозволить їй запускатись у фоновому режимі (все ж вихід програми все одно перейде до TTY).

Якщо ви хочете вбити призупинену програму, вам не доведеться повертати її fgспочатку, ви можете просто виконати команду:

kill %1

Якщо у вас є кілька призупинених команд, запустіть

jobs

перерахує їх так:

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

Використання %#, де #це номер завдання (один в квадратних дужках з jobsвиходом) з bg, fgабо kill, може бути використаний , щоб зробити дію на цю роботу.


3
Ви можете змінити, які ключі виконують якусь роботу, скориставшись sttyкомандою. Наприклад stty susp ^Z або stty intr ^C.
RedGrittyBrick

7
Насправді він надсилає SIGTSTP, який можна перехопити.
Саймон Ріхтер

2
Класно! Отже, якщо програма відмовляється вмирати за допомогою Ctrl + C, як ви змусите її вбити?
Депутат Адітія

2
@adityamenon Знайдіть ім'я виконавця, наприклад, amarokзапустіть killall amarok, або запустіть ps auxі знайдіть ідентифікатор процесу поруч із іменем виконуваного файлу та запустіть kill {process id}.
Бруно Фінгер

22

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


Ні, це SIGTSTP, а не SIGSTOP, і його можна перехопити.
sch

@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 - номер роботи.


Це завдання (групи процесів), а не процеси, з якими справляються CTRL-C, CTRL-Z, fg та bg.
sch

3
Cntrl + Z pause the currently running process. 

І

Cntrl + C simply terminates the running process.

Використовуючи Cntrl + C, ви не можете відновити процес. де, використовуючи Cntrl + Z, ви можете відновити процес.

використовуйте fg% 1 для відновлення процесу.


3

CTRL+ Zзупиняє (призупиняє) роботу

CTRL+ Cприпиняє роботу

З CTRL+ Cви не можете відновити процес, але з CTRL+ Zзавдання можна відновити, просто ввівши в командний рядок:

fg% 1

Якщо у вас кілька призупинених процесів, вам слід це зробити

робочі місця

щоб побачити вихід.


2

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

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