ctrl-c 이벤트를 어떻게 잡을 수 있습니까?


133

C ++에서 Ctrl+ C이벤트를 어떻게 잡을 수 있습니까?


콘솔 응용 프로그램, Windows 응용 프로그램 또는 무엇입니까?
GManNickG

7
어떤 OS Windows, Linux 등.
shf301

1
글쎄, 그것은 Qt 앱이지만 개발 중에 콘솔에서 실행 중입니다. (이것은 Linux입니다)
Scott

답변:


172

signal구현이 다르기 때문에 가장 신뢰할 수있는 방법은 아닙니다. 을 사용하는 것이 좋습니다 sigaction. Tom의 코드는 이제 다음과 같습니다.

#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

void my_handler(int s){
           printf("Caught signal %d\n",s);
           exit(1); 

}

int main(int argc,char** argv)
{

   struct sigaction sigIntHandler;

   sigIntHandler.sa_handler = my_handler;
   sigemptyset(&sigIntHandler.sa_mask);
   sigIntHandler.sa_flags = 0;

   sigaction(SIGINT, &sigIntHandler, NULL);

   pause();

   return 0;    
}

1
my_handler가 int s논쟁의 여지가 있다고 생각합니다 . sig_t그 자체가 함수 포인터 유형입니다.
Matthew Marshall

38
<stdlib.h> 등-C ++가 아닌 C입니다. C ++에서 당신은 사용해야 <cstdlib>
Abyx

8
printf()비동기 신호 안전하지 않으므로 신호 처리기 내부에서 사용할 수 없습니다.
PP

7
이 기능은 Windows에서 사용할 수 없습니다.
Timmmm

2
좋을 것이다 약 약간의 설명을 가지고 sa_masksa_flags.
qed


40

SIGINT 신호 를 잡아야합니다 (POSIX와 올바르게 대화하고 있습니까?)

sigaction에 대해서는 @Gab Royer의 답변을 참조하십시오.

예:

#include <signal.h>
#include <stdlib.h>
#include <stdio.h>

void my_handler(sig_t s){
           printf("Caught signal %d\n",s);
           exit(1); 

}

int main(int argc,char** argv)
{
   signal (SIGINT,my_handler);

   while(1);
   return 0;

}

네, POSIX입니다. 질문에 Linux를 추가하는 것을 잊었습니다.
Scott

2
signal ()은 BSD 또는 SysV 스타일을 따르는 지에 따라 다르게 동작합니다. sigaction ()이 바람직합니다.
asveikau

2
나는 그것이 오래되었다는 것을 알고 있지만 g ++ (Ubuntu 7.4.0-1ubuntu1 ~ 18.04.1) 7.4.0에서 컴파일되지 않습니다. 로 변경 void my_handler(sig_t s)해야했습니다 void my_handler(sig_atomic_t s).
jcmonteiro

1

예, 이것은 플랫폼에 따른 질문입니다.

POSIX에서 콘솔 프로그램을 작성하는 경우 신호 API ( #include <signal.h>)를 사용하십시오 .

WIN32 GUI 응용 프로그램에서는 WM_KEYDOWN메시지를 처리해야 합니다.

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