オープングループによる
<ブロック引用>tv_nsec メンバーは、0 以上で 1 秒 (1000 ミリオン) のナノ秒数より小さい場合にのみ有効です。この構造によって記述される時間間隔は (tv_sec * 10'-.4m'9'.4m'+ tv_nsec) ナノ秒です。
そのため、opengroup によると、1 秒未満でなければならないことが公式のようです。
答えは常に「いいえ」になると確信しています。
clock_gettime は tv_nsec>=10e9 では戻りません。 clock_settime() と clock_nanosleep() はどちらも入力にこの制限を課しているため、clock_gettime はそれと一致していると常に想定していました。
また、Linux + glibc では、glibc を深く掘り下げると、次のようなコードが表示されます:
glibc/nptl/pthread_clock_gettime.c からの抜粋:
/* Compute the seconds. */
tp->tv_sec = tsc / freq;
/* And the nanoseconds. This computation should be stable until
we get machines with about 16GHz frequency. */
tp->tv_nsec = ((tsc % freq) * 1000000000ull) / freq;
これは、glibc/sysdeps/unix/clock_gettime.c でも発生します。
しかし、その通りです。マニュアル ページには記載されていません。少なくとも私の Linux ディストリビューションや opengroup.org にはありません。そのため、実装は技術的に警告なしに変更される可能性があります。
Linux + glibc 向けに書いているのなら、安全だと思います。代替のオープン ソース libc ライブラリを自分で確認できます。 Android のバイオニック、または縮小された newlib。
他のクローズド ソース POSIX システムをターゲットにしている場合、あなたまたはあなたのクライアントはサポート料金の支払いに問題があるため、ドキュメントに記載されていないかどうかベンダーに問い合わせてください。
できるだけ移植性を持たせようとしていて偏執的である場合は、clock_gettime を次のように「正規化」関数でラップします。
int my_gettime( struct timespec * ts )
{
int ret;
if( 0 == (ret = clock_gettime(SOME_CLOCK, ts))
{
while (tv_nsec >= 1000000000 )
{
ts->tv_nsec -= 1000000000;
ts->tv_sec += 1;
}
}
return ret;
}