![](/img/trans.png)
[英]Best way to exit application at CTRL+C interrupt on Linux. (C/C++)
[英]Ctrl + C interrupt event handling in Linux
我正在開發一個使用 C++ 並使用 Linux GNU C 編譯器編譯的應用程序。
我想在用戶使用Ctrl + C鍵中斷腳本時調用一個函數。
我該怎么辦? 任何答案將不勝感激。
當您按Ctr + C 時,操作系統會向進程發送信號。 有許多信號,其中之一是 SIGINT。 SIGINT(“程序中斷”)是終止信號之一。
還有更多種類的終止信號,但關於 SIGINT 的有趣之處在於它可以由您的程序處理(捕獲)。 SIGINT 的默認操作是程序終止。 也就是說,如果您的程序沒有專門處理此信號,則當您按Ctr + C 時,您的程序將作為默認操作終止。
要更改信號的默認操作,您必須注冊要捕獲的信號。 要在 C 程序中注冊信號(至少在 POSIX 系統下),有兩個函數
這些函數要求在您的 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.