我想使用特定的鍵盤鍵組合來終止進程,例如我想透過按 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;
}