Menurut grup terbuka
Anggota tv_nsec hanya valid jika lebih besar atau sama dengan nol, dan kurang dari jumlah nanodetik dalam satu detik (1000 juta). Interval waktu yang dijelaskan oleh struktur ini adalah (tv_sec * 10'-.4m'9'.4m'+ tv_nsec) nanodetik.
Jadi menurut opengroup, terlihat resmi bahwa harus kurang dari 1 detik.
Saya cukup yakin jawabannya akan selalu "tidak".
clock_gettime tidak akan kembali dengan tv_nsec>=10e9. clock_settime() dan clock_nanosleep() menempatkan batasan ini pada masukan mereka, jadi saya selalu menganggap clock_gettime konsisten dengan itu.
Juga di Linux + glibc, jika Anda menggali glibc cukup dalam, Anda akan melihat kode seperti ini:
Kutipan dari 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;
Ini juga terjadi di glibc/sysdeps/unix/clock_gettime.c.
Tapi Anda benar, halaman manual tidak mengatakannya. Setidaknya bukan yang ada di distro Linux saya atau di opengroup.org. Jadi implementasi secara teknis dapat berubah tanpa peringatan.
Jika Anda menulis untuk Linux + glibc, menurut saya keamanan Anda. Anda dapat memeriksa sendiri pustaka libc sumber terbuka alternatif, mis. Bionik Android, atau newlib yang diperkecil.
Jika Anda menargetkan beberapa sistem POSIX sumber tertutup lainnya, Anda atau klien Anda mengalami masalah dalam membayar dukungan, jadi tanyakan kepada vendor jika tidak didokumentasikan.
Jika mencoba menjadi seportabel mungkin dan merasa paranoid, bungkus clock_gettime dengan fungsi "normalisasi" seperti ini:
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;
}