- ベストアンサー
clock_gettime()についての質問
- clock_gettime()関数について理解できない箇所があります。クロックの時間とは何を指すのでしょうか?分解能は理解できますが、1クロックが何秒や何ナノ秒に相当するのかがわかりません。
- clock_gettime()関数は、指定されたクロックの時間を取得するための関数です。しかし、「クロックの時間」という表現が具体的に何を指すのか、理解できません。1クロックが何秒や何ナノ秒に相当するのかが知りたいです。
- clock_gettime()関数について質問です。指定されたクロックの時間を取得する関数ですが、「クロックの時間」という言葉の意味がよくわかりません。1クロックが何秒や何ナノ秒に相当するのか教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
おっと、別のコードを見てたようです。失礼しました。 もっとも、bef⇒t1, aft⇒t2と置き換えて基準時間1秒固定という以外は#3の説明で間違ってないはずです。 timespecは「秒以上」を表すtv_secと「秒未満」を表すtv_nsecの組み合わせなので、合算しないと正しい時間になりません。 このとき秒に合わせるとtv_nsecは0と同じことになりますしナノ秒に合わせると秒がオーバーフローするので求める精度に応じてミリ秒もしくはマイクロ秒に合わせておくと。 > ナノ秒については+1000000000ns (=+1s) > という処理をおこなっていますが、 そもそもtv_nsecに負値が入るケースがあるかどうかが疑問ではありますが、これは単純に「後の計算を簡単にするため」と思えばいいかと思います。
その他の回答 (4)
- D-Matsu
- ベストアンサー率45% (1080/2394)
> 3.0000000059が得られたとして、 > tv_secに3が、 > tv_nsecに59x10^(-9)が この場合、tv_nsecには普通に59が入ります。 メンバー名からして「ナノ秒」と言ってますし、そもそも型がlong(整数型)でしょう? > chk_difftime()はclock_gettimeで得られた値をつかってなにを > しようとしているのかがわからないのです。 bef:スリープ開始時間 aft:スリープ終了時間 sec:経過させる秒 nsec:経過させるナノ秒 で、開始から終了までの時間が指定時間±許容範囲以内かどうかを「ミリ秒」で計算してますね。
- D-Matsu
- ベストアンサー率45% (1080/2394)
> 3.0000000059が得られたとして、 > tv_secに3が、 > tv_nsecに59x10^(-9)が この場合、tv_nsecには普通に59が入ります。 メンバー名からして「ナノ秒」と言ってますし、そもそも型がlong(整数型)でしょう? > chk_difftime()はclock_gettimeで得られた値をつかってなにを > しようとしているのかがわからないのです。 bef:スリープ開始時間 aft:スリープ終了時間 sec:経過させる秒 nsec:経過させるナノ秒 で、開始から終了までの時間が指定時間±許容範囲以内かどうかを「ミリ秒」で計算してますね。
お礼
ありがとうございました!
補足
>bef:スリープ開始時間 >aft:スリープ終了時間 このような変数は、 http://crackerjack.good-day.net/cjk/system_calls/295 のサンプルにはありませんが・・・。 chk_difftime()の (t.tv_sec * 1000) + (t.tv_nsec / 1000000) はミリ秒にするための計算だということですが、 clock_gettimeで得られた秒とナノは合算して 扱うものなのですか? if (t.tv_nsec < 0) { t.tv_sec -= 1; t.tv_nsec += 1000000000; } ですが、ナノsecが0以下の場合、 秒については-1s ナノ秒については+1000000000ns (=+1s) という処理をおこなっていますが、 なぜこのような処理が必要になるのですか? なにをしようとしているのかがわかりません。
- D-Matsu
- ベストアンサー率45% (1080/2394)
同じmanの中にクロック辺りの精度を取るgetres()と時間設定・取得のsettime()およびgettime()がありますが、両者がごっちゃになってませんか? clock_gettime()は言葉通り「時間」を取得するということでいいはずです。 「指定されたクロックclk_id」という翻訳が微妙にアレですが、ここは「clk_idで指定したクロック(時計)」と解釈しましょう。
お礼
「指定した時計から時間を取得する」と考えればよいのですね? ありがとうございます。
補足
あと、下記のメンバの中に秒とナノが入る ということなのですが、これもわからないのです。 struct timespec { time_t tv_sec; /* 秒 */ long tv_nsec; /* ナノ秒 */ }; たとえば、いま、時間を取得すると、 3.0000000059が得られたとして、 tv_secに3が、 tv_nsecに59x10^(-9)が はいるということですか? そもそもhttp://crackerjack.good-day.net/cjk/system_calls/295 でclock_gettime()の使い方をまなぼうとしてはまってしまったのですが、 chk_difftime()はclock_gettimeで得られた値をつかってなにを しようとしているのかがわからないのです。 (t.tv_sec * 1000) + (t.tv_nsec / 1000000)によって何が得られるのか? if (t.tv_nsec < 0) { ttv_sec -= 1; ttv_nsec += 1000000000; } はなんのためにおこなっているのか? ご教示のほどよろしくお願いします。
- notnot
- ベストアンサー率47% (4900/10358)
クロックが何種類かあってその中の一つを引数の clockid_t clk_id で指定します。 値として指定出来るのは、そのページに書いてあるものだと、 CLOCK_REALTIME CLOCK_MONOTONIC CLOCK_PROCESS_CPUTIME_ID CLOCK_THREAD_CPUTIME_ID の4つのどれか。手元のCentOS5.6のmanだと6種類書いてあります。 この4つの中から「引数で指定されたクロック」が示している時刻を返します。 なので、文をぶつ切りにした "クロックの時間" というのは意味を持ちません。 使った経験は無いのでどういう時に使うのかは知りません。通常のクロックはCLOCK_REALTIMEなんでしょうね。
お礼
理解できました。どうもありがとうございました。