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;
}

相關內容