nanosleep使用示例

nanosleep 是 POSIX 标准中用于高精度休眠的函数,允许指定纳秒级的休眠时间。以下是一个使用示例和详细说明:

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <time.h>

int main() {
struct timespec req = {
.tv_sec = 1, // 秒部分(1 秒)
.tv_nsec = 500000000 // 纳秒部分(0.5 秒,即总休眠 1.5 秒)
};
struct timespec rem; // 用于保存剩余时间(若休眠被中断)

printf("开始休眠...\n");

// 调用 nanosleep
int ret = nanosleep(&req, &rem);

if (ret == 0) {
printf("休眠完成!\n");
} else {
// 若因信号中断,输出剩余时间
printf("休眠中断,剩余时间: %ld 秒 %ld 纳秒\n", rem.tv_sec, rem.tv_nsec);
}

return 0;
}

关键点说明

  1. 头文件依赖

    • <time.h>:提供 nanosleep 函数和 timespec 结构体。
  2. 函数原型

    1
    int nanosleep(const struct timespec *req, struct timespec *rem);
    • **req**:指向 timespec 的指针,指定休眠时间。
    • **rem**:若休眠被信号中断,保存剩余休眠时间(可设为 NULL 忽略)。
  3. timespec 结构体

    1
    2
    3
    4
    struct timespec {
    time_t tv_sec; // 秒(≥0)
    long tv_nsec; // 纳秒(0~999,999,999)
    };
    • 注意tv_nsec 必须在合法范围内,否则函数立即失败。
  4. 返回值

    • 0:休眠成功完成。
    • -1:失败(检查 errno),常见原因:
      • EINTR:被信号中断。
      • EINVAL:时间参数非法。
  5. 编译与运行

    1
    2
    gcc -o nanosleep_example nanosleep_example.c
    ./nanosleep_example

实际应用场景

1
2
3
4
5
6
// 高精度循环延迟(每秒触发一次)
for (int i = 0; i < 5; i++) {
struct timespec delay = {.tv_sec = 1, .tv_nsec = 0};
while (nanosleep(&delay, &delay) == -1 && errno == EINTR); // 自动重试中断
printf("第 %d 次触发\n", i+1);
}

注意事项

  • 精度限制:实际休眠时间受系统时钟精度和调度策略影响。
  • 信号安全:若需处理信号中断,建议在循环中重试休眠。
  • 替代方案:Linux 专属的 clock_nanosleep 可提供更精细控制(如选择时钟类型)。

如有进一步问题,欢迎提出!