GNU/Linux >> Linux の 問題 >  >> Linux

clock_gettime() を呼び出すと、返される tv_nsec フィールドが実際に 1 秒を超えることがありますか?

オープングループによる

<ブロック引用>

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

Linux
  1. Linuxストーリー:バックアップがその日を救ったとき

  2. 親プロセスが終了したときの新しい親プロセス?

  3. `relatime`がデフォルトになったのはいつですか?

  1. デスクトップを2番目の接続された画面に拡張する方法は?

  2. 行の最後のフィールドでのソート

  3. Linuxシェルは、2番目の列に従ってファイルをソートしますか?

  1. caddr_t の重要性と使用時期は?

  2. パーティションが読み取り専用の場合の Windows 10 パスワードの回復

  3. lvm を使用する場合、fdisk パーティションの種類は重要ですか?