Unix-system-calls-getitimer

提供:Dev Guides
移動先:案内検索

[top]#

[[File:]]

[[File:]]

|Web |This Site

  • 初心者向けのUnix *
  • 高度なUnix *

選択した読書

Copyright©2014 by finddevguides

  Home     References     Discussion Forums     About TP  

getitimer()-Unix、Linuxシステムコール

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] image:http://www.finddevguides.com/add- this.gif [AddThisソーシャルブックマークボタン]

広告

NAME

getitimer、setitimer-インターバルタイマーの値を取得または設定します

概要

#include <sys/time.h> int getitimer(int which, struct itimerval* value); int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);

説明

システムは、各プロセスに3つのインターバルタイマーを提供し、それぞれが個別の時間ドメインで減少します。 タイマーの期限が切れると、シグナルがプロセスに送信され、タイマーが(潜在的に)再起動します。

Tag

説明

*ITIMER_REAL*

リアルタイムで減少し、有効期限が切れると SIGALRM を配信します。

*ITIMER_VIRTUAL*

プロセスの実行中にのみデクリメントし、有効期限が切れると SIGVTALRM を配信します。

*ITIMER_PROF*

プロセスが実行されるときと、プロセスに代わってシステムが実行されるときの両方で減少します。 ITIMER_VIRTUAL と組み合わせると、このタイマーは通常、ユーザーおよびカーネルスペースでアプリケーションが費やした時間をプロファイルするために使用されます。 SIGPROF は有効期限が切れると配信されます。

タイマー値は、次の構造によって定義されます。

struct itimerval { struct timeval it_interval;/*next value*/ struct timeval it_value; /*current value*/ }; struct timeval { long tv_sec; /*seconds*/ long tv_usec; /*microseconds*/ };

関数 getitimer ()は、whichITIMER_REALITIMER_VIRTUAL 、または ITIMER_PROF のいずれか)で示されるタイマーの現在の設定で、_value_で示される構造を埋めます。 要素_it_value_は、タイマーの残り時間に設定されます。タイマーが無効な場合はゼロに設定されます。 同様に、_it_interval_はリセット値に設定されます。 関数 setitimer ()は、指定されたタイマーを_value_の値に設定します。 _ovalue_がゼロ以外の場合、タイマーの古い値がそこに保存されます。

タイマーは、_it_value_からゼロにデクリメントし、信号を生成して、_it_interval_にリセットします。 ゼロに設定されたタイマー(_it_value_がゼロ、またはタイマーが期限切れになり、_it_interval_がゼロ)が停止します。

_tv_sec_と_tv_usec_は両方とも、タイマーの継続時間を決定する上で重要です。

タイマーは、要求された時間よりも前に期限切れになることはありませんが、その後、システムタイマーの解像度とシステムの負荷に応じて、少し(短い)時間切れになる場合があります。 (ただし、以下のバグを参照してください。)有効期限が切れると、シグナルが生成され、タイマーがリセットされます。 プロセスがアクティブな間にタイマーが期限切れになると( ITIMER_VIRTUAL の場合は常にtrue)、シグナルは生成されるとすぐに配信されます。 そうしないと、システムの負荷に応じて配信がわずかな時間で相殺されます。

返り値

成功すると、ゼロが返されます。 エラーの場合、-1が返され、_errno_が適切に設定されます。

エラー

Tag Description
EFAULT value or ovalue are not valid pointers.
*EINVAL * which is not one of* ITIMER_REAL*, ITIMER_VIRTUAL, or ITIMER_PROF.

ノート

*fork* (2)を介して作成された子は、親のインターバルタイマーを継承しません。 インターバルタイマーは、 *execve* (2)で保持されます。

準拠

POSIX.1-2001、SVr4、4.4BSD(この呼び出しは4.2BSDで初めて登場しました)。

関連項目

シグナルの生成と配信は別個のものであり、上記の各シグナルの1つのインスタンスのみがプロセスに対して保留されている場合があります。 非常に重い負荷がかかると、 ITIMER_REAL タイマーは、以前の有効期限からのシグナルが配信される前に期限切れになる場合があります。 このようなイベントの2番目の信号は失われます。

Linuxでは、タイマー値はjiffiesで表されます。 要求が行われた場合、jiffies表現がMAX_SEC_IN_JIFFIES(_include/linux/jiffies.h_で定義されている)を超える値を持つタイマーを設定すると、タイマーはこの上限値まで暗黙的に切り捨てられます。 Linux/x86では(カーネル2.6.13以降、デフォルトのjiffyは0.004秒です)、これはタイマーの上限値が約99.42日であることを意味します。

特定のシステム(x86を含む)では、バージョン2.6.12より前のLinuxカーネルには、特定の状況下で最大1 jiffyの早すぎるタイマー満了を引き起こすバグがあります。 このバグはカーネル2.6.12で修正されています。

POSIX.1-2001は、0から999999の範囲外の_tv​​_usec_値が指定されている場合、 setitimer ()は失敗するはずであると述べています。 ただし、Linuxはエラーを表示せず、代わりにタイマーの対応する秒の値をサイレントに調整します。 将来(2007年3月に予定)、この不適合は修復されます。既存のアプリケーションは、適切に形成された_tv_usec_値を提供するように修正する必要があります。

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]

広告

  
Advertisements