Unix 명령 행에서 Ctrl + Z와 Ctrl + C의 차이점은 무엇입니까?


188

Mac OS X 터미널을 사용하고 있습니다. 그리고 Ctrl+ Z또는 Ctrl+ C를 사용 하여 일부 프로그램을 중지합니다. 그러나 나는 그들이 정확히 무엇을하고 있는지 모른다는 것을 깨달았습니다. 그것들은 무엇이며 그들 사이의 차이점은 무엇입니까?

이 질문은 금주슈퍼 사용자 질문입니다 . 자세한 내용은
2011 년 3 월 13 일 블로그 항목 을 읽 거나 자신의주의 질문을 제출하십시오 .

답변:


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 12

7
실제로는 가로 챌 수있는 SIGTSTP를 보냅니다.
Simon Richter

2
시원한! 따라서 프로그램이 Ctrl + C로 죽기를 거부한다면 어떻게 강제로 죽입니까?
Aditya MP

2
@adityamenon 실행 파일 이름 (예 : amarok및 run killall amarok) ps aux을 찾 거나 실행 파일 이름 옆에서 프로세스 ID를 찾아 실행하십시오 kill {process id}.
Bruno Finger

22

Ctrl + Z는 SIGTSTP를 사용하여 프로세스를 일시 중단합니다. 나중에 다시 시작할 수 있습니다. Ctrl + C는 SIGINT를 사용하여 프로세스를 종료합니다.이 프로세스는 대상에서 처리 / 무시하지 않는 한 프로세스를 종료하므로 다시 시작할 수 없습니다. SIGSTOP도 있고 kill()프로세스가 가로 챌 수 없습니다. SIGCONT는 프로세스 일시 중단을 해제하는 SIGSTOP 및 SIGTSTP에 대응합니다.


아니요, SIGSTOP이 아니라 SIGTSTP이며 가로 챌 수 있습니다.
sch oc

@sch, 지금 맞습니까?
Ben Voigt

예. Ctrl-Z (및 CTRL-C)는 프로세스 그룹 (터미널의 포 그라운드 프로세스 그룹)이 반드시 하나의 프로세스 만이 아니라 해당 신호를 수신하게합니다. 또한 SIGTTIN과 SIGTTOU는 터미널의 포 그라운드 프로세스 그룹에없는 프로세스로 보내지거나 읽거나 쓰려고 할 때 프로세스에 보내지는데,이 또한 중지합니다.
sch 2

@sch : 프로세스 대 그룹은 신호가 전송되는 방식의 차이점이 아닌가? IIRC를 kill()사용하면 SIGSTOP그룹에 잘 보낼 수 있습니다 .
Ben Voigt

그렇습니다. 제 명령은 CTRL-Z가 프로세스를 일시 중단하는 것입니다. 실제로 작업 또는 프로세스 그룹 때 프로세스가 하나의 프로세스로 전송된다고 사람들을 오도 할 수 있습니다 .
sch

17

Ctrl + Z가 작업을 중지 (일시 중지)

CTRL + C는 작업을 종료합니다

CTRL + C를 사용하면 프로세스를 재개 할 수 없지만 CTRL + Z를 사용하면 promt 명령을 입력하여 작업을 재개 할 수 있습니다.

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 ...은 맨 앞 (부모) 프로세스 만 일시 중단하고 자식을 원하는대로 실행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.