C は、強力で柔軟性があり、さまざまなアプリケーション開発に適した人気のあるプログラミング言語です。 C でアプリケーションを開発する場合、さまざまな信号を処理する必要があることがよくあります。この記事では、開発者がこの側面をよりよく習得できるように、C での信号処理テクニックを紹介します。
1. 信号処理の基本概念
信号は、アプリケーションに内部イベントまたは外部イベントを通知するために使用されるソフトウェア割り込みです。特定のイベントが発生すると、オペレーティング システムはアプリケーションに信号を送信し、アプリケーションはそれを無視するか応答するかを選択できます。 C では、シグナル処理関数を通じてシグナルを処理できます。アプリケーションはシグナルを受信すると、受信したシグナルに対応するシグナル処理関数を呼び出します。
2. 信号処理関数の登録
C 言語の信号処理関数は、特定の信号を受信したときに呼び出せるようにアプリケーションに登録する必要があります。登録はC標準ライブラリの「signal」関数を使用して行うことができます。以下は例です。
#include <signal.h> #include <iostream> void signal_handler(int signum){ std::cout << "Received signal: " << signum << std::endl; } int main() { signal(SIGINT, signal_handler); while (true) {} return 0; }
上の例では、シグナルを受信したときにシグナル番号を出力する「signal_handler」という名前の関数を定義しました。 「signal」関数を使用して、SIGINT シグナルを「signal_handler」関数に関連付けます。 「while (true)」はシグナルの受信を待つために使用します。
3. 信号の分類
C では、信号は標準信号とリアルタイム信号の 2 種類に分類できます。
標準信号は、発生したイベントをアプリケーションに通知するためにオペレーティング システムによって送信されます。 C の標準信号には、SIGABRT、SIGALRM、SIGFPE、SIGHUP、SIGILL、SIGINT、SIGKILL、SIGPIPE、SIGQUIT、SIGSEGV、SIGTERM、SIGUSR1/SIGUSR2 があります。これらの信号は、信号処理機能を通じて処理できます。
リアルタイム シグナルは、他のアプリケーションまたはスレッドにイベントを通知するためにアプリケーションによって送信されます。 C のリアルタイム信号には、SIGRTMIN/SIGRTMAX が含まれます。標準信号とは異なり、リアルタイム信号は信頼性があり、決定的です。
4. シグナル利用スキル
C におけるシグナル応答は、優先順位に従って決定されます。信号ごとに優先順位が異なるため、信号処理機能の優先順位を変更することで信号の応答を制御できます。優先度は「sa_flags」フィールドを使用して識別され、優先順位は SA_SHIRQ、SA_RESTART、SA_NODEFER、SA_ONSTACK、SA_NOCLDSTOP、SA_NOCLDWAIT、SA_SIGINFO、および SA_RESETHAND です。
アプリケーションがシグナルを受信すると、オペレーティング システムはそのシグナルを保留中としてマークします。この時点でアプリケーションが同じ信号を再度受信すると、オペレーティング システムはその信号を破棄し、信号処理機能はトリガーされません。この状況は信号ブロッキングと呼ばれます。 C では、以下に示すように、「sigprocmask」関数を使用してシグナルをブロックできます。
#include <signal.h> int main() { sigset_t mask; sigemptyset(&mask); sigaddset(&mask, SIGINT); sigprocmask(SIG_BLOCK, &mask, NULL); while (true) {} return 0; }
上の例では、「sigprocmask」関数を使用して SIGINT シグナルをブロックします。 「while (true)」ステートメントを実行すると、信号はブロックされ、信号処理関数はトリガーされません。
C でのシグナル キャプチャは、シグナル プロセッサをインストールすることで実現できます。 「sigaction」関数を使用すると、シグナル ハンドラーをインストールし、特定のシグナル ハンドラーを特定のシグナルにバインドできます。以下に例を示します。
#include <signal.h> #include <iostream> void signal_handler(int signum){ std::cout << "Received signal: " << signum << std::endl; } int main() { struct sigaction act; sigemptyset(&act.sa_mask); act.sa_flags = 0; act.sa_handler = signal_handler; sigaction(SIGINT, &act, NULL); while (true) {} return 0; }
上の例では、「sigaction」関数を使用して、SIGINT シグナルを「signal_handler」関数にバインドします。 SIGINT シグナルを受信すると、signal_handler 関数が呼び出され、シグナル番号が出力されます。
4. 概要
この記事では、信号処理関数の登録、信号分類、信号応答の優先順位、信号ブロック、信号キャプチャなど、C での信号処理技術を紹介します。これらの手法を理解することは、開発者が信号処理の基本概念と原理をよりよく理解し、アプリケーションの信頼性と安定性を向上させるのに役立ちます。
以上がC++ の信号処理テクニックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。