「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Sigaction 関数を使用して C++ で Ctrl-C 割り込みを適切に処理する方法

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

2024 年 11 月 17 日に公開
ブラウズ:303

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);

where:

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

Thomas が示した例では、sigaction 構造は次のとおりです。 sigIntHandler.sa_handler = my_handler; sigemptyset(&sigIntHandler.sa_mask); sigIntHandler.sa_flags = 0;

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);

sigaction(SIGINT, &sigIntHandler, NULL);
Handler function

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

void my_handler(int s){ printf("信号 %d をキャッチしました\n", s); 終了(1); }

sigaction(SIGINT, &sigIntHandler, NULL);
完全なコード

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

#include #include #include #include void my_handler(int s){ printf("信号 %d\n",s); 終了(1); } int main(int argc,char** argv) { 構造体 sigaction sigIntHandler; sigIntHandler.sa_handler = my_handler; sigemptyset(&sigIntHandler.sa_mask); sigIntHandler.sa_flags = 0; sigaction(SIGINT, &sigIntHandler, NULL); 一時停止(); 0を返します。 }

#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;    
}
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3