首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Ubuntu 系統下實現毫秒/微秒級延時的正確方法:usleep、nanosleep 與 clock_nanosleep 詳解

     編輯:程式設計綜合問答

在 Ubuntu(Linux)開發中,Sleep 是 Windows API,delay 多為 Turbo C 古老庫函數,兩者在標準 Linux 頭文件中均不存在。正規做法是使用 POSIX 標準的 usleep(微秒)、nanosleep(納秒)或更高精度的 clock_nanosleep。

常用延時函數對比

函數頭文件精度備註
usleep(useconds_t)<unistd.h>微秒 (µs)POSIX.1-2001,已標記棄用但廣泛可用
nanosleep(const struct timespec*, struct timespec*)<time.h>納秒 (ns)推薦標準做法,可被信號中斷並返回剩餘時間
clock_nanosleep(clockid_t, int, const struct timespec*, struct timespec*)<time.h>納秒 (ns)可指定時鐘源(CLOCK_MONOTONIC 避免系統時間調整影響)

毫秒級延時封裝範例

#include <time.h>
#include <errno.h>

void msleep(long ms) {
    struct timespec req = { .tv_sec = ms / 1000, .tv_nsec = (ms % 1000) * 1000000 };
    struct timespec rem;
    while (nanosleep(&req, &rem) == -1 && errno == EINTR) {
        req = rem; // 被信號中斷則重新睡眠剩餘時間
    }
}

微秒級延時封裝範例

#include <unistd.h>

void usleep_wrapper(unsigned int us) {
    while (us > 0) {
        unsigned int chunk = us > 1000000 ? 1000000 : us; // usleep 參數上限通常為 1e6
        usleep(chunk);
        us -= chunk;
    }
}

高精度定時器替代方案

  • timerfd + epoll:適合事件驅動架構,可融入主循環,精度達微秒級。
  • POSIX 間隔定時器 (setitimer / timer_create):產生 SIGALRM/SIGRTMIN 信號,需處理信號安全。
  • busy-wait (rdtsc/clock_gettime):極短延時(<10µs)可用自旋,但會佔用 CPU 核心。

常見誤區提醒

  • man usleep 顯示「No manual entry」通常是未安裝 manpages-posix 或 manpages-dev,執行 sudo apt install manpages-posix manpages-dev 即可。
  • 舊教材使用 syscall(SYS_nanosleep, ...) 屬底層調用,應用層請直接呼叫庫函數。
  • 內核調度粒度(通常 1ms)限制實際喚醒精度;嚴格實時需求請用 PREEMPT_RT 內核或用戶空間自旋。

掌握 nanosleep 與 clock_nanosleep 的正確用法,即可在 Ubuntu/Linux 下靈活實現從毫秒到納秒級的精準延時控制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved