왜 Ctrl-C가 터미널 자체를 죽이지 않습니까?


답변:


47

Ctrl+ C는 인터럽트 신호입니다. 이것을 터미널에 입력하면 bash는 SIGINT를 포 그라운드의 작업으로 보냅니다. 작업이 없으면 (단지 터미널을 연 경우) 아무 일도 일어나지 않습니다. 터미널 에뮬레이터 프로그램은 쉘에서 실행되는 작업이 아니므로 신호를 얻지 못하고 닫히지 않습니다.

제어 키로 터미널을 닫으려면 Ctrl+ D(EOF)를 사용하여 bash를 종료하십시오 (터미널도 닫습니다).

참조 : 배쉬 초보자 가이드를 신호에 더 깊이 신호 처리 작동 방법
참고 :이 답변은 코멘트를 게시 된 이후 편집 된


4
적절한 용어는 쉘이 신호를 "트랩"한다는 것입니다. 다른 이야기는 다른 창에서 터미널 창을 시작할 때입니다. ctrl + c를 부모 창으로 보내면 자식 프로세스가 종료됩니다.
Sergiy Kolodyazhnyy 2014 년

1
또한 X11 서버에서 오는 특정 신호를 트랩하도록 GUI 창에 지시 할 수도 있습니다. 저장하지 않은 작업을 알리는 팝업을 표시하거나 브라우저에서와 같이 탭을 열 수 있습니다.
Sergiy Kolodyazhnyy

8
@chrylis 터미널 프로그램은 ctrl-c 문자를 전송합니다. 실제로 커널 tty 레이어는 신호로 변환됩니다.
Random832

3
@chrylis : 그리고 터미널이나 터미널 내에서 실행되는 프로그램 (예 : 텍스트 편집기)은 Ctl-C를 다른 동작으로 변환 할 수 있습니다.
jamesqf

3
bashctrl-c를 눌렀을 때 어떤 프로그램도 종료 하지 않을 것이라고 생각 합니다. 커널에게 어떤 프로세스 그룹이 활성화되어 있는지 알려주고 터미널 프로그램으로부터 ctrl-c를 수신하면 커널은 해당 프로세스 그룹에 신호를 생성합니다.
kasperd

32

^C키는 다른 키 입력 *처럼, 마법 아니다 - 그것은 프로그램에 포커스가 중에 키 코드를 전송합니다. (X에서 키 코드는 C0x4에 대한 수정자를 사용하여 54입니다 Ctrl.) 키 스트림을 수신하는 프로그램은 키 스트림에 적합한 작업을 수행합니다. 많은 GUI 응용 프로그램에서 키 입력은 클립 보드에 복사됩니다.

GUI 터미널 에뮬레이터 (예 : Konsole) 또는 가상 터미널이로 해석되는 키 입력을 수신하면 ^C세 가지 중 하나를 수행 할 수 있습니다. 터미널이있는 경우 원시 모드 , 다음 실행중인 프로그램을 수행하지 않도록 터미널을 요청했다 어떤 특수 키 자체의 처리 및 프로그램에 바로 전달할 수 있습니다. 라인 편집과 같은 고급 기능을 지원하는 일부 프로그램은 완전한 원시 키 스트로크와 처리 된 텍스트 라인 사이에 일부 구성에서 키보드 입력을 수신합니다. bash예를 들어, 한 번에 하나씩 키 입력을받습니다. ^C터미널에서 해석하지만 백 스페이스 키는있는 그대로 쉘로 전송됩니다.

그러나 대부분의 프로그램은 쿡 모드 (원시가 아니기 때문에)를 사용합니다. 터미널은 실제로 키 입력을 프로그램으로 보내기 전에 일부 기본 키 입력을 해석합니다 cat. 이 모드에서 터미널 자체는 ^C키 입력을 SIGINT신호 로 변환 하여 자식 프로세스로 보냅니다. 터미널이 신호를 생성 했으므로 혼동되어 종료되지 않습니다.

  • SysRq 정말 마법입니다.

분명히 여기에는 관련성이 없지만 일반적인 컴퓨팅에는 더 많은 마법의 키 입력이 있습니다. 가장 유명한 것은 Windows 세계에서 Ctrl+ Alt+ Delete키 조합이 마술에 매우 가깝습니다 (Windows가 작동하도록하는 데 사용될 수 있으며, 그 자체로는 마술입니다!). SysRq그 의미에서 와 비슷한 거의 모든 것을 무시 합니다.
KRyan

7
Bash는 raw 모드를 사용하지 않습니다.-한 번에 문자 모드를 사용합니다 (예 : cbreak/ -icanon). 그러나 isig모드 설정을 그대로두고 매핑 된 키를 누를 때 실제 신호를 수신합니다. 이 처리 SIGINT는 설명 된대로 (그냥, 행 편집을 취소하지 않는 그것은 또한 루프에서 실행 될 수있는 내부 명령을 취소) 행동에 의해 완전히 무시 SIGTSTP하고 SIGQUIT. vi와 같은 다른 프로그램은 그렇지 않을 수 있습니다.
Random832

1
@KRyan Ctrl+ Alt+ Delete오늘날보다 더 마술로 사용 - blogs.msdn.microsoft.com/oldnewthing/20140912-00/?p=44083 . 나는 리눅스를 좋아하지만 Windows가 초기에 제한된 리소스로 사용자에게 친숙하고 논리적으로 물건을 만드는 정도에 따라 종종 끔찍합니다.
Muzer

일부 OS에서는 다른 프로그램이 시스템에 초점을 맞추더라도 터미널 에뮬레이터보다 실제로 키 누르기를 얻습니다. 키보드 바로 가기를 구성하여 창을 스냅하고 응용 프로그램을 열고 스크립트를 트리거 한 다음 누른 키가 터미널 에뮬레이터로 전송되기 전에 구성한 바로 ​​가기가 있는지 확인합니다. 그리고 응용 프로그램이 열려 있지 않은 또 다른 예 ^c는 창 관리자를 죽이지 않습니다 :). 한 번에 생 / 요리 한 캐릭터에 대해서는 언급 할 수 없지만, 그 키 스트로크가 어떻게 생성되는지에 대한 해답이 있습니다SIGINT
Ajay

2
" 요리 모드 ( 요리 가 아니기 때문에)": 말이 없습니다. 이 모든 세월이 지나도 나는 결코 연결하지 못했습니다.
isanae

8

^C보통 (참조 매핑되는 stty -a받는) SIGINT신호 (참고 man 7 signal).

잡히지 SIGINT않으면 실행중인 프로세스 가 중단되지만 ...

SIGINT 프로세스가 동작을 지정할 수있는 신호 중 하나입니다 ( "신호 포착").

"터미널"이라고 부르는 것은 붙잡아 SIGINT다시 작동합니다.


7

초보자 일 때 명령 줄을 사용할 때 실제로 터미널과 셸 (예 : bash)의 두 가지 별도 프로그램을 사용하고 있다는 부분이 누락되었습니다.

쉘은 이미 알고있는 것입니다. 입력 명령이나 스크립트로 사용하여 실행하고 출력을 인쇄하는 프로그램입니다.

다른 쪽의 터미널은 사용자와 프로그램 사이의 중간에있는 사람과 같습니다 (이 프로그램은 일반적으로 배쉬 또는 물고기와 같은 껍질입니다). 터미널이하는 일은 예를 들어 키보드에서 입력을 읽고 어떤 식 으로든 입력을 처리하고 다른 프로그램 (bash)으로 리디렉션하는 것입니다.

또한 이것은 다른 방식으로도 작동합니다. 다른 프로그램이 무언가를 출력 할 때 무언가가 터미널로 리디렉션되면 화면에 출력하는 것이 터미널의 작업입니다. 입력을받는 것과 화면에 인쇄하는 것 사이에서 터미널은 다양한 방법으로 입력을 해석 할 수 있습니다.

예를 들어 프로그램이 다음 순서를 출력하는 경우 :

\e[0;31m some extra foobar text

터미널은 붉은 색 글자와 함께 "일부 추가 foobar 텍스트"화면으로 출력됩니다. 때문이다 터미널이 선택하는 특별한 방법으로 이상한 코드를 치료하기 위해 이 빨간색으로 다음과 같은 출력을 인쇄하는 코드 힌트.

마찬가지로 사용자가을 누를 때 Ctrl - C, 이것에 대한 유일한 특별한 점은 터미널이 그것을 특별한 방식으로 취급하기로 선택한다는 것입니다.이 키 순서에는 다른 특별한 것이 없습니다. 특히 이것은 인터럽트 신호 (SIGINT)를 터미널 내부에서 실행중인 프로세스, 즉 쉘로 보내도록 암시합니다. 그 시점에 쉘에 의해 생성되고 현재 포 그라운드에서 실행중인 프로그램이 있으면 신호도 수신합니다. 이제 쉘에는이 신호에 대한 특수 처리기가 있으며 아무 일도 일어나지 않습니다. 그러나 대부분의 프로그램에는 SIGINT의 경우 종료되는 기본 핸들러가 있습니다.


5

모든 신호에는 이와 관련된 기본 동작이 있습니다. 신호의 기본 동작은 스크립트 또는 프로그램이 신호를 수신 할 때 수행하는 동작입니다.

Ctrl+ C는 "인터럽트"신호 ( SIGINT )를 전송하며 , 기본값은 포 그라운드에서 실행중인 작업으로 프로세스를 종료하는 것입니다.

Ctrl+ D는 표준 입력에 EOF 를 등록해야한다고 터미널에 지시합니다. bash는 종료 하려는 욕구로 해석 합니다.

프로세스는 INT 신호를 무시하도록 선택할 수 있으며 Bash는 대화식 모드에서 실행될 때이를 무시합니다.

로부터 수동 :

bash가 대화식 일 때 트랩이없는 경우 SIGTERM을 무시하고 (kill 0은 대화식 쉘을 종료하지 않음) SIGINT가 포착되어 처리됩니다 (대기 내장 대기 가능). 모든 경우에 bash는 SIGQUIT를 무시합니다. 작업 제어가 유효하면 bash는 SIGTTIN, SIGTTOU 및 SIGTSTP를 무시합니다.


트랩으로 이해하십시오 .

트랩 은 하드웨어 신호 및 기타 이벤트에 응답하는 셸에 내장 된 기능입니다. 쉘이 신호 또는 기타 특수 조건을 수신 할 때 실행될 핸들러를 정의하고 활성화합니다.

trap [-lp] [arg] [sigspec …]

-l 신호 이름 및 해당 번호 목록을 인쇄하십시오.
-p각 SIGNAL_SPEC와 관련된 트랩 명령을 표시합니다.

쉘이 신호 sigspec을 수신하면 arg를 읽고 실행합니다. 각 sigspec은 신호 이름 또는 신호 번호입니다. 신호 이름은 대소 문자를 구분하지 않으며 SIG 접두어는 선택 사항입니다.

경우 sigspec가 있다 0 또는 EXIT , 인수는 때 쉘 종료 실행됩니다. 이해하려면 .bashrc파일 에서 다음 줄을 편집 한 후 터미널을 닫고 엽니 다 .

trap 'notify-send "Ctrl D pressed"' 0

Ctrl D는 exit터미널에서 나가라는 명령 과 유사합니다 .

대화식 모드에서도 INT 신호 수신시 Bash를 종료하려면 다음을 추가 할 수 있습니다 ~/.bashrc.

trap 'exit' INT

또는

trap 'exit' 2

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