这是一个非常基础且常用的函数,用于让程序暂停执行一段指定的时间。

(图片来源网络,侵删)
核心要点
- 功能:使程序的执行暂停(或休眠)指定的秒数。
- 头文件:使用
sleep()函数需要包含<unistd.h>头文件。 - 返回值:如果函数成功使进程挂起
sleeptime秒,则返回0,如果因为接收到信号而提前被唤醒,则返回剩余的秒数(即sleeptime- 实际休眠秒数)。 - 单位:参数
sleeptime的单位是秒。
函数原型
在 <unistd.h> 中,sleep() 函数的原型通常是这样的:
unsigned int sleep(unsigned int seconds);
如何使用(代码示例)
下面是一个简单的例子,演示如何使用 sleep() 函数。
#include <stdio.h>
#include <unistd.h> // 必须包含这个头文件
int main() {
printf("程序即将开始休眠...\n");
// 休眠5秒钟
printf("开始休眠5秒,\n");
sleep(5); // 程序在这里暂停5秒
// 5秒后,程序继续执行
printf("休眠结束!程序继续运行,\n");
return 0;
}
编译和运行:
在 Linux 或 macOS 终端中,你需要使用 gcc 进行编译:

(图片来源网络,侵删)
gcc my_program.c -o my_program
然后运行:
./my_program
预期输出:
你会看到输出,然后程序会暂停5秒钟,接着输出最后一行。
程序即将开始休眠...
开始休眠5秒.
// (这里会等待5秒)
休眠结束!程序继续运行.
重要注意事项
跨平台性问题
这是使用 sleep() 函数时最需要注意的一点。

(图片来源网络,侵删)
- Linux / macOS / Unix-like 系统:
sleep()函数在<unistd.h>中定义,单位是秒。 - Windows 系统:Windows 的 C 运行时库中没有
<unistd.h>和sleep()函数,Windows 提供了功能类似但头文件和函数名都不同的函数。
在 Windows 上如何实现类似功能?
Windows 使用 <windows.h> 头文件中的 Sleep() 函数(注意首字母大写)。
- 头文件:
#include <windows.h> - 函数原型:
void Sleep(DWORD milliseconds); - 单位:参数的单位是毫秒。
- 返回值:无返回值(
void)。
跨平台解决方案
如果你的代码需要在 Windows 和 Linux/macOS 之间移植,你可以使用预处理器指令 #ifdef 来选择正确的函数。
#include <stdio.h>
#ifdef _WIN32
// 如果是Windows系统
#include <windows.h>
#define SLEEP(seconds) Sleep((seconds) * 1000)
#else
// 如果是Linux或macOS系统
#include <unistd.h>
#define SLEEP(seconds) sleep(seconds)
#endif
int main() {
printf("Hello, ");
SLEEP(2); // 这行代码在两个平台上都能工作,只是底层调用的函数不同
printf("World!\n");
return 0;
}
sleep() 的准确性
sleep() 函数的休眠时间不保证是精确的,它只是一个最小休眠时间。
- 系统调度:操作系统可能会因为调度策略,在
sleep()请求的时间之后才恢复你的进程,这意味着实际休眠时间可能会比sleeptime稍长。 - 信号中断:如果进程在休眠期间收到了信号,
sleep()函数会提前返回,这是它返回非零值(剩余秒数)的唯一情况。
sleep() vs. usleep() 和 nanosleep()
C 语言标准库中还有其他类似的休眠函数,它们提供了不同的精度。
| 函数名 | 头文件 | 单位 | 精度 | 备注 |
|---|---|---|---|---|
sleep() |
<unistd.h> |
秒 | 低 | 最常用,但精度不高。 |
usleep() |
<unistd.h> |
微秒 (1/1,000,000 秒) | 中 | 注意:在 POSIX.1-2001 及以后的标准中,该函数已被废弃,推荐使用 nanosleep()。 |
nanosleep() |
<time.h> |
纳秒 (1/1,000,000,000 秒) | 高 | 更现代、更精确的选择,可以指定其行为在信号中断后是否继续休眠剩余时间。 |
nanosleep() 示例:
#include <stdio.h>
#include <time.h> // nanosleep的头文件
int main() {
struct timespec req = {0}; // 初始化为0
struct timespec rem = {0}; // 用于接收剩余时间
req.tv_sec = 1; // 休眠1秒
req.tv_nsec = 500000000; // 再休眠500毫秒 (0.5秒)
printf("开始使用 nanosleep 休眠 1.5 秒...\n");
// nanosleep 返回0表示成功,-1表示出错
// 如果被信号中断,它会返回-1,并设置errno为EINTR,rem中会存放剩余时间
if (nanosleep(&req, &rem) == -1) {
printf("nanosleep 被信号中断,剩余时间: %ld.%09ld 秒\n", rem.tv_sec, rem.tv_nsec);
} else {
printf("nanosleep 成功完成,\n");
}
return 0;
}
| 特性 | sleep() |
|---|---|
| 用途 | 简单的延时,不要求高精度。 |
| 优点 | 简单易用,几乎所有类 Unix 系统都支持。 |
| 缺点 | 不跨平台(Windows 需用 Sleep()),精度低(秒级),可能被信号中断。 |
| 跨平台写法 | 使用 #ifdef 宏定义,封装一个自己的 SLEEP() 函数。 |
对于简单的、非跨平台的延时任务,sleep() 是一个很好的选择,如果需要高精度延时,应考虑使用 nanosleep(),如果需要编写跨平台代码,务必处理好平台差异。
