C および Linux のタイマー メカニズム
Linux と C を使用して、タイミング関数をきめ細かく制御できます。
タイマー メカニズムを使用すると、あらかじめ決められた時間が経過したときにアプリケーションに通知するように OS カーネルをスケジュールできます。 通常、2 つの情報を指定して使用します。 まず、通知するまでにタイマーがかかる時間を指定する必要があります。 次に、通知が発生したときに動作するコールバック関数を準備する必要があります。
Linux および Unix ベースのシステムのタイマー メカニズムは、さまざまなニーズに応えるために進化してきました。 さまざまなアプローチは、さまざまな種類の問題の解決に役立ちます。 ただし、多くの場合、警報()仕組みは今でも使われています。
アラーム機能はタイマーを使用する最も簡単な方法です。 これがそのプロトタイプです:
この方法を使用すると、時間を秒単位でのみ指定できます。 時間が経過すると、オペレーティング システムはシガルムアプリケーションに信号を送ります。 アプリケーションでタイマーの期限切れを処理するには、コールバック関数も定義する必要があります。
以下はシグナル ハンドラー関数の例です。
このコードは、シガルム後の信号1 2番。 タイマー遅延を 5 秒に増やしたい場合は、電話してください。アラーム(5)その代わり。 タイマーを停止するには、値 0 を渡します。アラーム(0)。
時間が経過しても、使用するタイマーは定期的に再起動されません。 たとえば、さらに 1 秒遅らせたい場合は、別の呼び出しでメカニズムを再起動する必要があります。警報()。
この方法は使いやすいですが、いくつかの欠点があります。
上記のサンプルコードを次の名前で保存しますアラーム.c 。 コンパイルして実行すると、プログラムはタイマーコールバック 1秒後に機能します。 その後、残りの 2 秒間待機します。睡眠(3)ラインを入力して終了します。
time コマンドを使用する理由は、時間を確認できるようにするためです。 しかし、結果を見ると、合計の実行時間は 3 秒ではありません。 これは、シガルムからの信号アラーム(1)最初の 1 秒が経過したとき、システムコール sleep(3) 関数が実行されていることが原因です。 この信号が到着すると、開始されたシステムコールが中断されます。睡眠(3)。
インターバル タイマー メカニズムは、バージョン 4.2 BSD で初めて利用可能になりました。 その後、POSIX によって標準化されました。 従来のものと比べた主な利点警報()ベースのタイマーメソッドは次のとおりです。
インターバルタイマーの動作に使用される関数プロトタイプは次のとおりです。
インターバルタイマーを設定したい場合は、期間限定構造体。 この構造体を 2 番目の引数として使用して値を渡す必要があります。週関数。
たとえば、アプリケーションに 1 秒間通知し、その後 300 ミリ秒ごとに通知するインターバル タイマーは次のように設定できます。
新しい値が設定される前にアクティブなインターバル タイマーが存在する場合、その値はインターバル タイマーの変数アドレスに転送されます。期間限定関数の 3 番目のパラメータに指定される型。
インターバルタイマー機構を使用して、3 種類のタイマーを設定できます。 の最初のパラメータでタイマーの種類を指定します。setitimer():
タイマーの種類
信号
説明
ITIMER_REAL
シガルム
アプリケーションが費やした時間とは関係なく、合計経過時間に対して計算されます。
ITIMER_VIRTUAL
SIGVTALRM
アプリケーションがユーザー モードのみで実行されている時間にわたって計算されます。
ITIMER_PROF
シグプロフ
ユーザー モードとシステム モードの両方でアプリケーションが費やした時間の合計で計算されます。
この表からわかるように、ITIMER_REALタイプは送信しますシガルム信号と同じように、警報()関数。
インターバルタイマーを使ったり、警報()同じアプリケーション内で使用すると混乱を招く可能性があります。 次の方法で残り時間を再度確認することもできますが、gettimer()、同時に使用しても意味がありません。
デバッグ ヘッダーを使用してシグナル ハンドラー関数を定義する例を次に示します。
上記のコードでは、寝る() 3秒待つ機能。 この間、インターバル タイマーが最初は 1 秒間実行され、次に 300 ミリ秒の間隔で実行されます。
理解を深めるために、サンプル コードを次の名前で保存してコンパイルします。間隔.c:
タイマーの実行後の出力からわかるように、タイマーは 300 ミリ秒ごとにコールバック関数を呼び出します。
ただし、少し待っても、アプリケーションが終了しないことに気づきます。 コールバック関数は 300 ミリ秒ごとに実行され続けます。 間隔の値をミリ秒単位で増やすと、アプリケーションが終了することがわかります。 これは使用エリアによるものです。寝る()関数。
特にリアルタイム アプリケーションの場合、タイマー メカニズムは非常に重要です。 これは、パフォーマンスの最適化に使用されるソリューションでもあります。 これを使用して、アプリケーションの稼働時間や遅延を測定することもできます。 タイマー メカニズムを使用して、経過時間と時間遷移イベントを追跡することが重要です。
Fatih は、フリーランスのセキュリティ研究者、ペネトレーション テスター、マルウェア アナリストです。 2017 年以来、彼はさまざまなソフトウェア言語とテクノロジ、特に C、C++、Python、x86 アセンブリに積極的に取り組んでいます。 彼は 100 社以上の大企業の脆弱性を報告してきました。 彼は、オペレーティング システムとクラウド アーキテクチャを扱うエンジニアとして研究を続けています。
alarm() その日のビデオを作成 スクロールしてコンテンツを継続 SIGALRM SIGALRM 1 アラーム(5) アラーム(0) アラーム() アラーム.c timer_callback sleep(3) SIGALRM アラーム(1) syscall sleep(3 アラーム() itimerval settimer itimerval setitimer() ITIMER_REAL SIGALRM アラーム() アラーム() gettimer() スリープ() インターバル.c スリープ()