Linux 中的 C SIGINT 信号

Linux 中的 C SIGINT 信号

我想制作特定的键盘按键组合来终止进程,例如我想通过按 CTRL + C ^ 3 (按三次 C:CTRL + CCC)来终止进程。

所以基本上我想用 CTRL + CCC 替换 CTRL + C

答案1

Ctrl+的默认行为C是两件事的组合。终端驱动程序 1 不会传输此按键,而是发送一个SIGINT信号到前台进程²。默认情况下,进程在收到 SIGINT 时就会终止,但进程可以设置信号处理程序,然后在收到 SIGINT 时运行该信号处理程序。

无法将终端驱动程序配置为仅转换连续第三个Ctrl+C来终止前台进程。为此,您需要在程序中数到三。有两种方法可以做到这一点,如果用户在Ctrl+之间按下其他内容,则行为会有所不同C

一种方法是禁用Ctrl+C发送信号并告诉终端驱动程序传递信号的行为。您可以通过致电来做到这一点stty intr \^-来自 shell 脚本或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

如果你想要正好 3 次 ctrl-c。当按 3 次 ctrl-c 时,您可以计算 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;
}

相关内容