Sigaction 関数を使用して C で Ctrl-C 割り込みを適切に処理する方法

Mary-Kate Olsen
リリース: 2024-11-13 01:35:02
オリジナル
524 人が閲覧しました

How to Gracefully Handle Ctrl-C Interrupts in C   with the Sigaction Function?

C での Ctrl-C イベントのインターセプト

Ctrl-C イベントのインターセプトは、プログラミングにおいて必要なタスクであり、特に、正常に応答したい場合に重要です。予期せぬ中断。

Sigaction を使用する

C では、関数 sigaction を使用してシグナルを処理する方が確実です。構文は次のとおりです:

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
ログイン後にコピー

ここで:

  • signum: 処理されるシグナルの番号。Ctrl-C の場合、SIGINT です。
  • act: 新しいシグナル ハンドラーのアクションを指定します。
  • oldact: 以前の動作を保存します。

Thomas が示した例では、sigaction 構造は次のとおりです:

struct sigaction sigIntHandler;

sigIntHandler.sa_handler = my_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
ログイン後にコピー

ここで:

  • sa_handler: ハンドラー関数を指します。 。
  • sa_mask: この信号の処理中に防止する信号マスク。
  • sa_flags: 追加のフラグ、通常は 0。

この sigaction 構造体を SIGINT シグナルで使用します。

sigaction(SIGINT, &sigIntHandler, NULL);
ログイン後にコピー

ハンドラー関数

最後に、応答するハンドラー関数が必要です。信号まで。この例では、my_handler はメッセージを出力してプログラムを終了します。

void my_handler(int s){
   printf("Caught signal %d\n", s);
   exit(1);
}
ログイン後にコピー

完全なコード

これは、sigaction を使用して Ctrl-C イベントをキャプチャする完全なコードです。 :

#include 
#include 
#include 
#include 

void my_handler(int s){
           printf("Caught signal %d\n",s);
           exit(1); 

}

int main(int argc,char** argv)
{

   struct sigaction sigIntHandler;

   sigIntHandler.sa_handler = my_handler;
   sigemptyset(&sigIntHandler.sa_mask);
   sigIntHandler.sa_flags = 0;

   sigaction(SIGINT, &sigIntHandler, NULL);

   pause();

   return 0;    
}
ログイン後にコピー

sigaction を使用すると、Ctrl-C イベントを確実にキャッチし、適切なアクションを実行できます。

以上がSigaction 関数を使用して C で Ctrl-C 割り込みを適切に処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート