C++ を使用し、Linux GNU C Compiler を使用してコンパイルするアプリケーションを開発しています。
Ctrlユーザーが+C キーを使用してスクリプトを中断したときに関数を呼び出したい。
私は何をすべきか?どんな答えでも大歓迎です。
C++ を使用し、Linux GNU C Compiler を使用してコンパイルするアプリケーションを開発しています。
Ctrlユーザーが+C キーを使用してスクリプトを中断したときに関数を呼び出したい。
私は何をすべきか?どんな答えでも大歓迎です。
を押すCtr + Cと、オペレーティング システムからプロセスにシグナルが送信されます。多くのシグナルがあり、そのうちの 1 つが SIGINT です。SIGINT (「プログラム割り込み」) は終了シグナルの 1 つです。
終了シグナルにはさらにいくつかの種類がありますが、SIGINT の興味深い点は、プログラムで処理 (キャッチ) できることです。SIGINT のデフォルトのアクションは、プログラムの終了です。つまり、プログラムがこのシグナルを明確に処理しない場合、 を押すCtr + Cと、プログラムはデフォルト アクションとして終了します。
シグナルのデフォルト アクションを変更するには、キャッチするシグナルを登録する必要があります。C プログラム (少なくとも POSIX システムでは) にシグナルを登録するには、2 つの関数があります。
これらの関数では、ヘッダーsignal.hを C コードに含める必要があります。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 でコンパイルし、シェルから実行できます。SIGINT
コードには無限ループがあり、を押して信号を送信するまで実行されますCtr + C。