GNU/Linux >> Belajar Linux >  >> Linux

Saat menjalankan clock_gettime() dapatkah bidang tv_nsec yang dikembalikan benar-benar melebihi satu detik?

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;
}

Linux
  1. Kapan terakhir kali Anda menggunakan Windows?

  2. Apa yang Terjadi Saat Saya Mengeksekusi File Di Shell?

  3. Kapan `relatime` Menjadi Default?

  1. Apakah Mungkin Penyelesaian Bash Untuk Berputar Melalui Alternatif?

  2. Linux mengurutkan file shell menurut kolom kedua?

  3. Apa pentingnya caddr_t dan kapan digunakan?

  1. Memeriksa apakah dir. entri yang dikembalikan oleh readdir adalah direktori, tautan, atau file. dent->d_type tidak menunjukkan jenisnya

  2. Apa status kedua dalam keluaran acara tautan ip

  3. Memulihkan kata sandi Windows 10 saat partisi hanya-baca