Linux의 C SIGINT 신호

Linux의 C SIGINT 신호

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

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

답변1

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

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

한 가지 방법은 신호를 보내고 대신 신호를 통과하도록 터미널 드라이버에 지시하는 Ctrl+ C의 동작을 비활성화하는 것입니다. 전화해서 하시면 됩니다stty intr \^-쉘 스크립트에서 또는tcsetattr(fd, &termios)with termios.c_cc[VINTR]set to _POSIX_VDISABLEfrom C. 그런 다음 프로그램의 입력 처리 루프에서 세 개의 Ctrl+ C'가 연속으로 표시되면 종료합니다.

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

¹ 모든 터미널을 처리하는 운영 체제의 일반적인 부분인 터미널 에뮬레이터가 아닙니다.
² 간단한 경우만 설명하겠습니다. 이것은 터미널 드라이버가 어떻게 작동하는지에 대한 논문이 아닙니다.

답변2

신호는 OS에서 프로세스로 전송되는 소프트웨어 생성 인터럽트이므로 코드에서 키 바인딩을 변경할 수 없습니다. 사용자가 Ctrl-C를 누르면 다른 프로세스가 프로세스에 무언가를 알려줍니다.

프로세스에 보낼 수 있는 수정된 신호 세트가 있습니다. 신호는 인터럽트와 유사합니다. 차이점은 인터럽트는 프로세서에 의해 중재되고 커널에 의해 처리되는 반면, 신호는 커널에 의해 중재되고(아마도 시스템 호출을 통해) 프로세스에 의해 처리된다는 점입니다. 커널은 인터럽트를 발생시킨 프로세스에 신호로 인터럽트를 전달할 수 있습니다(일반적인 예는 SIGSEGV, SIGBUS, SIGILL 및 SIGFPE입니다).

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

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

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

정확히 3번을 원하면 ctrl-c를 누르세요. 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;
}

관련 정보