10

私はclock_gettime()コマンドを操作し、そこから取得したミリ秒単位を追加しようとしてtimespecいます。私はこれを行うことができますか?

//milli is an int that can be any number (within reason)
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_nesc += (milli*1000000);

または、それを分割して最初に秒があるかどうかを調べ、それらをtv_secフィールドに追加してから、残りをに追加する必要がありtv_nsecますか?

基本的に、tv_nsecフィールドは 1 秒以上のナノ秒を保存できますか?

4

2 に答える 2

14

それはあなたがそれで何をしようとしているのかに完全に依存します.

aのtv_nsecメンバーのstruct timespec型はlongです。LONG_MIN~の範囲で任意の値に設定できますLONG_MAXLONG_MAX少なくとも 2 31 -1 であるを超える計算を実行すると、問題が発生します (おそらく、値の折り返しとして現れる未定義の動作)。

0 未満の値に設定するか、10 億以上の値に設定すると問題が発生するかは、その値をどうするかによって異なります。単に印刷したり、計算を実行したりするだけの場合は、有効なlong値であれば問題ありませんが、格納された値を正規化すると、おそらくより便利になります。

clock_gettime()tv_nsec常に0..999999999 の範囲の値を与える必要があります。

POSIX では、clock_settime()「tp 引数が 0 未満または 10 億以上のナノ秒値を指定した」場合、、、およびclock_nanosleep()関数nanosleep()が失敗し、 に設定さerrnoれる必要があります。EINVAL

参考文献:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_settime.html http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_nanosleep.html http://pubs.opengroup.org/onlinepubs/ 9699919799/関数/nanosleep.html

于 2013-06-14T18:40:15.220 に答える
1

tv_nsecフィールドは、限られた量のナノ秒のオーバーフローを許容します (常に、2 つの有効な timespec ナノ秒値を追加するのに十分なので、999999999 + 999999999 = 1999999998)。ただし、任意の量のオーバーフローが機能するという保証はありません。32 ビットの実装ではlong、2 秒強のナノ秒、つまり 2.147483647 秒までしか上げることができません。したがって、誰かが 2500 ミリ秒 (2.5 秒) を追加するように指示した場合、それはオーバーフローします。

編集して追加: Keith Thompson が指摘しているように、timespec を別の timespec に追加した後、再正規化する必要があります。

于 2013-06-14T18:39:40.760 に答える