34

C++ を使用し、Linux GNU C Compiler を使用してコンパイルするアプリケーションを開発しています。

Ctrlユーザーが+C キーを使用してスクリプトを中断したときに関数を呼び出したい。

私は何をすべきか?どんな答えでも大歓迎です。

4

3 に答える 3

70

を押すCtr + Cと、オペレーティング システムからプロセスにシグナルが送信されます。多くのシグナルがあり、そのうちの 1 つが SIGINT です。SIGINT (「プログラム割り込み」) は終了シグナルの 1 つです。

終了シグナルにはさらにいくつかの種類がありますが、SIGINT の興味深い点は、プログラムで処理 (キャッチ) できることです。SIGINT のデフォルトのアクションは、プログラムの終了です。つまり、プログラムがこのシグナルを明確に処理しない場合、 を押すCtr + Cと、プログラムはデフォルト アクションとして終了します。

シグナルのデフォルト アクションを変更するには、キャッチするシグナルを登録する必要があります。C プログラム (少なくとも POSIX システムでは) にシグナルを登録するには、2 つの関数があります。

  1. signal(int signum, sighandler_t ハンドラ);
  2. sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); .

これらの関数では、ヘッダー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

于 2013-07-20T21:42:31.903 に答える