2016-08-21 24 views
8

通常、NTPやadjtime()の影響を受けないクロックを取得する場合は、CLOCK_MONOTONIC_RAWが使用されます。しかしclock_nanosleep()CLOCK_MONOTONIC_RAWをサポートしていないので、それを使用しようとすると復帰コード95 が返されます。(カーネル4.6.0)はサポートされていません。clock_nanosleepはadjtimeとNTPの影響を受けますか?

clock_nanosleep()は、どういうわけか、これらのクロック調整を考慮に入れるか、スリープ時間に影響されますか?

クロック調整の影響を受けないスリープ時間が必要な場合の代替方法はありますか?

答えて

2

CLOCK_MONOTONIC_RAWclock_nanosleep()はLinux 2.6.28以降でwas introducedです。 2.6.32 because of oopsesでこのサポートを持たないのはexplicitly fixedでした。そのコードはその後数回リファクタリングされましたが、CLOCK_MONOTONIC_RAWのサポートはまだclock_nanosleep()にありません。についてのコメントは見つかりませんでした。はそれです。

この機能を明示的に無効にし、すべてのレビューをパスしたパッチがあったという事実は、カーネル開発者にとって大きな問題のようには見えないことを示しています。したがって、現時点(4.7)the only things CLOCK_MONOTONIC_RAW supportsclock_getres()clock_gettime()です。

already noted by RichCLOCK_MONOTONICよう、調整といえばちょうどこの時計の性質により、レート調整の対象となります。これは、hrtimer_interrupt()が調整された単調時間値(ktime_get_update_offsets_now() - >timekeeping_get_ns() - >timekeeping_delta_to_ns())でキューを実行し、xtime_nsecsubject to adjustment)で動作するためです。実際には、このコードを見れば、おそらくはclock_nanosleep()のサポートを持たないことにもう驚いていません。—調整された単調時計の使用はhrtimersの基礎と思われます。

代替案はありません。 nanosleep() uses the same CLOCK_MONOTONIC,setitimer() has its own set of timers,alarm() uses ITIMER_REAL (same as setitimer())、(with some indirection)がalso our good old friend CLOCK_MONOTONICである。他に何がありますか?私は何もないと思う。

clock_nanosleep()を(TIMER_ABSTIMEではなく)CLOCK_REALTIME actually becomes a synonym for CLOCK_MONOTONICという相対的な間隔で呼び出すと、関連しない副作用として興味深い観察があります。

+1

非常に参考になった回答、あなたの努力のおかげで。したがって、[Richの答え](http://stackoverflow.com/a/39064645/165063)によると、 'CLOCK_MONOTONIC'は' CLOCK_MONOTONIC_RAW'よりも正確であり、特に 'adjtime'調整が短い間隔では無視できるので、小さなスリープに適しています。 – scai

関連する問題