簡體   English   中英

Linux 中的 Ctrl + C 中斷事件處理

[英]Ctrl + C interrupt event handling in Linux

我正在開發一個使用 C++ 並使用 Linux GNU C 編譯器編譯的應用程序。

我想在用戶使用Ctrl + C鍵中斷腳本時調用一個函數。

我該怎么辦? 任何答案將不勝感激。

當您按Ctr + C 時,操作系統會向進程發送信號 有許多信號,其中之一是 SIGINT。 SIGINT(“程序中斷”)是終止信號之一。

還有更多種類的終止信號,但關於 SIGINT 的有趣之處在於它可以由您的程序處理(捕獲)。 SIGINT 的默認操作是程序終止。 也就是說,如果您的程序沒有專門處理此信號,則當您按Ctr + C 時,您的程序將作為默認操作終止。

要更改信號的默認操作,您必須注冊要捕獲的信號。 要在 C 程序中注冊信號(至少在 POSIX 系統下),有兩個函數

  1. 信號(int signum,sighandler_t 處理程序);
  2. sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); .

這些函數要求在您的 C 代碼中包含頭文件signal.h 我在下面提供了帶有注釋的signal函數的簡單示例。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h> //  our new library 
volatile sig_atomic_t flag = 0;
void my_function(int sig){ // can be called asynchronously
  flag = 1; // set flag
}

int main(){
  // Register signals 
  signal(SIGINT, my_function); 
  //      ^          ^
  //  Which-Signal   |-- which user defined function registered
  while(1)  
    if(flag){ // my action when signal set it 1
        printf("\n Signal caught!\n");
        printf("\n default action it not termination!\n");
        flag = 0;
    }     
  return 0;
}  

注意:您應該只在信號處理程序中調用安全/授權的函數 例如避免在信號處理程序中調用 printf

您可以使用 gcc 編譯此代碼並從 shell 執行它。 代碼中有一個無限循環,它會一直運行,直到您按Ctr + C發送SIGINT信號為止。

鍵入Ctrl C通常會導致 shell 向您的程序發送SIGINT 為該信號添加一個處理程序(通過signal(2)sigaction(2) ),您可以在按下 Ctrl C時執行您喜歡的操作。

或者,如果您只關心在程序退出之前進行清理,則通過atexit(3)設置退出處理程序可能更合適。

您可以使用信號宏。

以下是如何處理它的示例:

#include <signal.h>
#include <stdio.h>
void sigint(int a)
{
    printf("^C caught\n");
}
int main()
{
    signal(SIGINT, sigint);
    for (;;) {}
}

示例輸出:

Ethans-MacBook-Pro:~ phyrrus9$ ./a.out
^C^C caught
^C^C caught
^C^C caught
^C^C caught
^C^C caught

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM