Linux의 C SIGINT 신호

Linux의 C SIGINT 신호

프로세스를 종료하기 위해 특정 키보드 키 조합을 만들고 싶습니다. 예를 들어 CTRL+C^3(C를 세 번 누르기: CTRL+CCC)을 눌러 프로세스를 종료하고 싶습니다.

그래서 기본적으로 CTRL+C를 CTRL+CCC로 바꾸고 싶습니다.

답변1

Ctrl+의 기본 동작 C은 두 가지의 조합입니다. 터미널 드라이버 1은 이 키 입력을 전송하지 않고 대신SIGINT 신호포그라운드 프로세스²로. 기본적으로 프로세스는 SIGINT를 수신하면 종료되지만 프로세스는 신호 처리기를 설정한 다음 SIGINT를 수신하면 신호 처리기를 실행할 수 있습니다.

Ctrl세 번째 연속 + 만 변환하여 C포그라운드 프로세스를 종료하도록 터미널 드라이버를 구성할 수 없습니다 . 이렇게 하려면 프로그램에서 3까지 세어야 합니다. 이를 수행하는 방법에는 두 가지가 있습니다. 사용자가 Ctrl+ 사이의 다른 항목을 누르면 동작이 달라집니다 C.

Ctrl한 가지 접근 방식은 + SendSignal을 비활성화 C하고 터미널 드라이버에 신호 전달 동작을 알려주는 것입니다. 전화해서 하시면 됩니다stty intr \^-쉘 스크립트에서 또는tcsetattr(fd, &termios)그런 다음 프로그램의 입력 처리 루프에서 termios.c_cc[VINTR]세 개의 +가 연속으로 표시되면 종료하십시오._POSIX_VDISABLECtrlC

또 다른 접근 방식은 SIGINT에 대한 신호 처리기를 설정하고 호출 횟수를 세어 세 번째로 프로그램을 종료하는 것입니다. 그 사이에 정상적인 입력이 있으면 카운터를 재설정해야 할 수도 있습니다.

1은 터미널 에뮬레이터가 아니며 모든 터미널을 처리하는 운영 체제의 보편적인 부분입니다.
² 간단한 상황을 설명하고 있습니다. 이것은 터미널 드라이버의 작동 방식에 대한 논문이 아닙니다.

답변2

신호는 운영 체제에서 프로세스로 보내는 소프트웨어 생성 인터럽트이므로 코드에서 키 바인딩을 변경할 수 없습니다. 사용자가 ctrl-c를 누르면 다른 프로세스가 프로세스에 일부 정보를 알려줍니다.

프로세스에 보낼 수 있는 고정된 신호 세트가 있습니다. 신호는 인터럽트와 비슷하지만, 인터럽트는 프로세서에 의해 조정되고 커널에 의해 처리되는 반면, 신호는 커널에 의해 조정되고(아마도 시스템 호출을 통해) 프로세스에 의해 처리됩니다. 커널은 인터럽트를 발생시킨 프로세스에 신호로 인터럽트를 전달할 수 있습니다(일반적인 예는 SIGSEGV, SIGBUS, SIGILL 및 SIGFPE).

stty를 사용하여 컴퓨터의 신호 키 바인딩을 다시 매핑할 수 있습니다.

복사하려면 Ctrl+C를, 삽입하려면 Ctrl+Shift+C를 활성화하세요.

https://docstore.mik.ua/orelly/unix3/upt/ch05_08.htm

ctrl-c를 정확히 3번 원할 경우. ctrl-c를 3번 누르면 SIGINT를 평가하고 프로그램을 중단할 수 있습니다. (C를 세 번 누르세요: CTRL + CCC).

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

void sig_handler(int signo)
{
    static int counter=0;
    if (signo == SIGINT)
        counter++;
    printf("received SIGINT %d times\n", counter);
    if (counter == 3)
        exit(0);
}

int main() 
{ 
    if (signal(SIGINT, sig_handler) == SIG_ERR)
        printf("\ncan't catch SIGINT\n");
    while(1) 
        sleep(1);
    return 0;
}

관련 정보