我想制作特定的键盘按键组合来终止进程,例如我想通过按 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_VDISABLE
CtrlC
另一种方法是为 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;
}