ctrl-c를 여러 번 누르면 실행중인 프로그램이 더 빨리 종료됩니까?


41

나는 종종 큰 파일을 읽은 다음 잠시 후에 종료하고 싶지만
Ctrl+ C를 누르면 프로그램이 멈출 때 까지 지연이 발생 합니다. Ctrl+ C키를 여러 번 눌러 지연 시간을 줄일 수 있습니까? 아니면 내가 키 누르기를 낭비하고 있습니까?


다양한 자식 프로세스를 호출하는 프로세스를 실행할 때 Ctrl-C가 때로는 실행중인 자식을 중단하지만 부모 프로세스는 중단하지 않습니다. 이는 사실 bash이지만 zsh항상 부모를 닫는 경우에는 해당되지 않습니다 . 내가 좋아하는 이유 중 하나입니다 zsh.
joeytwiddle

17
예. 엘리베이터 버튼이나 횡단 보도 버튼을 반복해서 누르면 엘리베이터가 더 빨리 켜지거나 표시등이 녹색으로 빠르게 켜집니다.
Michael

3
예. 엘리베이터 및 횡단 보도 버튼과 마찬가지로 CTRL-C도 끈적 거리거나 녹슬거나 연결이 끊어 질 수 있습니다. 엘리베이터를 올릴 때, 도보 표시가 켜지거나 프로그램을 닫으려면 한 번의 프레스 만 등록하면되므로 더 많은 시간을 누르는 것이 좋습니다.
hippietrail

1
@hippietrail 그러나 ^C프레스가 등록 될 때 쉘이 출력 될 것입니다 (적어도 bash는 작동합니다)
wchargin

1
가치가있는 것에 대해서는, 나는 그것이 키 프레스를 낭비하는 것을 고려하지 않습니다-나는 그것이 손상을 입히지 않는 방식으로 약간의 좌절감을 환기시키는 것으로 생각합니다. (나는 보통 2-3 번 공격,하지만 난 당신이 항상 컴퓨터에 도달하는 모든 단일 키 입력에 포함되지 수 전화선 연결 단자 "에서 자랐"때문에 그 부분입니다.)
keshlam

답변:


35

첫 번째 후에 Ctrl-C프로그램은 SIGINTtmp 파일 삭제, 소켓 닫기 등 을 받고 일반적으로 정리를 시작합니다. 당신이 공격하면 Ctrl-C그 일이 벌어지고있는 동안 다시는 할 수 있습니다 (즉, 추가 신호가 깨끗한 업 인터럽트 루틴 일이 발생할 수도 뒤에 혼란을 떠나, 대신 혼자되는 작용 수를). 일반적으로 그렇지는 않지만 더 일반적으로 추가 신호는 이후에 전송됩니다.시스템과 작업자의 상호 작용에 내재 된 지연으로 인해 프로세스가 완료되었습니다. 즉, 다른 프로세스 (종종 쉘은 아니지만 항상)에 의해 신호가 수신됩니다. 해당 수신자가이 신호를 제대로 처리하지 않으면 (일반적으로 쉘이하는 것처럼-Jenny D의 답변 참조) 그러한 조치의 결과에 불쾌하게 놀랄 수 있습니다.


정리 루틴을 중단해야하는 이유는 무엇입니까? INT프로세스가 수신 한다는 또 다른 신호일뿐입니다 .
혼돈

4
@chaos 왜해야합니까? 정리 루틴이 중단되어 중지하려는 경우에해야합니다. 실제로 이런 식으로 작동합니까? 그렇습니다. 간단히 보여줄 수 있습니다 : single line으로 bash 스크립트를 만드십시오 trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10. 스크립트를 실행하고 ctrl-C를 두 번 누르십시오. 두 번째 ctrl-C가 "정리"루틴 (트랩 명령문에서)으로 전달되고 해당 sleep명령이 종료됨을 알 수 있습니다.
John1024

1
@ John1024 아, 이제 알겠습니다. 스크립트 스 니펫 주셔서 감사합니다 ^^ 그러나 정리는 취소되지 않습니다. 참조 : 신호를 얻는 명령 trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10일뿐 sleep입니다. 우리는 둘 다 잘못된 xD였다
혼돈

2
맞습니다. 신호 전달은 동 기적입니다. isig켜져 있으면 커널이 CTRL-C를 눌렀을 때 (터미널 에뮬레이터의 경우 터미널 에뮬레이터가 의사 터미널의 마스터 측에 쓰면) SIGINT 신호가 모든 터미널의 포 그라운드 프로세스 그룹의 프로세스. 거기에서 차단 될 수 있지만 나중에 다른 프로세스로 전달되지는 않습니다. 터미널 장치 버퍼가 가득 차더라도 (응용 프로그램이 입력 한 내용을 읽지 못했음) CTRL-C는 대기열을 뛰어 넘습니다.
Stéphane Chazelas

1
예를 들어, VLC는 여러 Ctrl + C 신호를 부정하게 종료하는 방법으로 해석하지만 단일 Ctrl + C는 깨끗하게 종료하려고 시도합니다.
Jeremy Visser

11

당신은 그들을 낭비하고 있습니다. 서버가 화면 출력을 마치면 여러 개의 서버가 수신됩니다 Ctrl-C. 첫 번째 프로세스는 프로세스를 종료하는 데 사용되며 다음 프로세스는 쉘에서 종료됩니다.

[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ 

6
SIGINT를 보낼 때 프로세스가 반드시 종료되는 것은 아닙니다. Ctrl + C를 누를 때마다 무기한으로 살아있을 수 있으며 다른 일을 할 수 있습니다.
Brian Gordon

참된. 사용자가 파일을 읽는 방법에 대해 가정했습니다.
Jenny D

5

짧은 대답 : 프로세스가 이에 반응하는 경우.

대답 : ctrl+를 c누르면 커널이 프로세스에 신호를 보냅니다. 다음 명령으로 어떤 신호를 결정할 수 있습니다.

user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;

의 매뉴얼 페이지를 참조하십시오 stty:

   intr CHAR
          CHAR will send an interrupt signal

이는 신호의 INT, 또한 공정이 이것에 반응 할 수있는 처리기의 신호를 갖는 경우 2. 번호라고도. 대부분의 프로세스는 일부 정리 작업을 수행하여 성공적으로 종료됩니다.


Ctrl-Z는 대개 SIGSTOP과 달리 처리 할 수있는 SIGTSTP를 전송합니다.
peterph

4
아니오, 프로세스에 SIGINT를 보내는 것은 쉘이 아닙니다. 그것은의 kernel전경 공정에서 모든 공정 SIGINT를 보낸다 (단말, 단말 드라이버의 제어 규칙) 그룹 단말 중.
Stéphane Chazelas

향후 독자는 unix.stackexchange.com/a/120071/135943 도 참조하십시오 .
와일드 카드

4

네가 옳아. 키 누름이 낭비되고 있습니다. 를 누르면 Crtl+C감지 될 때 지워야하는 자원이 있으므로 시간이 걸립니다. 누르기 Ctrl+C가 필요한 곳을 알 수있는 한 가지 사례 는 Yum 업데이트 프로세스를 취소하려는 경우이며, Yum에서는 Ctrl+C두 번 눌러 취소를 확인해야합니다.


2

Ctrl-C일반적인 경우에는 하나만 필요 하지만 필요한 경우도 있습니다. 예를 들어, 파이썬 Ctrl-C은 새 스레드가 생성 될 때 트래핑 하므로 많은 스레드를 시작하는 중에 문제가 발생하면 여러 번 다시 보내서 python부모 프로세스로 전달되지 않아야합니다. 잡혔다.


1
이것은 지금 나에게 발생하며 멀티 스레드 / 처리 된 파이썬 스크립트를 만들 때 발생합니다. 때로는 주요 프로세스가 종료되기 전에 여러 번의 프레스가 필요합니다.
Leo

0

나는 항상 언론에이 Ctrlc여러 번. 나는 첫 번째 언론에서 반응을 보인 적이 없으며 시스템이 실제로 Ctrlc전송되고 있음을 알 때까지 여러 번 사용해야합니다 . 실제로 대부분을 그리워하거나 잃어버린 것처럼 보입니다.

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