source

Linux에서 Ctrl + C 인터럽트 이벤트 처리

ittop 2023. 10. 9. 23:31
반응형

Linux에서 Ctrl + C 인터럽트 이벤트 처리

저는 C++를 사용하고 리눅스 GNU C 컴파일러를 사용하여 컴파일하는 어플리케이션을 개발하고 있습니다.

사용자가 +키를 사용하여 스크립트를 인터럽트하는 기능을 실행하고 싶습니다.

어떻게 해야 하나?어떤 답변이든 감사히 받겠습니다.

를 누르면 운영 체제가 프로세스로 신호를 보냅니다.여러 가지 신호가 있는데 그 중 하나가 SIGINT입니다.SIGINT("프로그램 인터럽트")는 터미네이션 신호 중 하나입니다.

Termination Signal에는 몇 가지 종류가 더 있지만 SIGINT의 흥미로운 점은 프로그램에서 처리(잡힐)할 수 있다는 것입니다.SIGINT의 기본 동작은 프로그램 종료입니다.즉, 프로그램에서 이 신호를 특별히 처리하지 않는 경우 프로그램을 누르면 기본 작업으로 종료됩니다.

신호의 기본 동작을 변경하려면 잡을 신호를 등록해야 합니다.(적어도 POSIX 시스템에서는) C 프로그램에 신호를 등록하려면 두 가지 기능이 있습니다.

  1. 신호(사인, sheatandler_t 핸들러);
  2. sigaction(시그넘, 구조체 sigaction *act, 구조체 sigaction *oldact);

이 함수들은 헤더 signal.h를 당신의 C 코드에 포함시켜야 합니다.저는 간단한 예를 제시했습니다.signal아래의 기능과 코멘트를 함께 제공합니다.

#include <stdio.h>
#include <stdlib.h>
#include <signal.h> //  our new library 
volatile sig_atomic_t flag = 0;
void my_function(int sig){ // can be called asynchronously
  flag = 1; // set flag
}

int main(){
  // Register signals 
  signal(SIGINT, my_function); 
  //      ^          ^
  //  Which-Signal   |-- which user defined function registered
  while(1)  
    if(flag){ // my action when signal set it 1
        printf("\n Signal caught!\n");
        printf("\n default action it not termination!\n");
        flag = 0;
    }     
  return 0;
}  

참고: 신호 처리기에서는 안전/인증 기능만 호출해야 합니다.예를 들어 printfin signal handler를 호출하지 마십시오.

이 코드를 gcc로 컴파일하여 셸에서 실행할 수 있습니다.코드에 무한 루프가 있고 당신이 a를 보낼 때까지 실행될 것입니다.SIGINT누름으로써 신호를 보내다

일반적으로 입력하면 셸이 전송됩니다.SIGINT당신의 프로그램에.해당 신호(또는 를 통해)에 대한 핸들러를 추가하면, 눌러진 상태에서 원하는 작업을 수행할 수 있습니다.

또는 프로그램이 종료되기 전에 정리 작업에만 관심이 있는 경우 를 통해 종료 처리기를 설정하는 것이 더 적합할 수 있습니다.

신호 매크로를 사용할 수 있습니다.

다음은 이 문제를 해결하는 방법의 예입니다.

#include <signal.h>
#include <stdio.h>
void sigint(int a)
{
    printf("^C caught\n");
}
int main()
{
    signal(SIGINT, sigint);
    for (;;) {}
}

샘플 출력:

Ethans-MacBook-Pro:~ phyrrus9$ ./a.out
^C^C caught
^C^C caught
^C^C caught
^C^C caught
^C^C caught

언급URL : https://stackoverflow.com/questions/17766550/ctrl-c-interrupt-event-handling-in-linux

반응형