注:本文为 “C语言 | Sleep 函数 / usleep 函数 / nanosleep 函数” 相关合辑。
图片清晰度受引文原图所限。
略作重排,未整理去重。
如有内容异常,请看原文。
C 语言中的 Sleep 函数用法
mainpulate于 2011-10-28 16:41:23 发布
若需在程序运行过程中实现暂停功能,C 语言中的 Sleep 函数是常用解决方案。
笔者通过查阅网络资料发现相关说法存在差异,且部分代码存在错误,经调试后,现将正确代码整理如下:
#include <stdio.h>
#include <windows.h>
int main()
{
int time;
printf("Please input a time(unit:second):\n");
scanf("%d", &time);
printf("Starting to calculate the time~\n");
while (1)
{
Sleep(1000);
time--;
printf("%d\n", time);
if (time == 0)
{
break;
}
}
printf("OK!! It's the time!\n");
return 0;
}
使用该函数需注意以下两点:
- 必须引入头文件
<windows.h>。 Sleep函数名中的首字母S需大写。
Sleep() 函数的使用方法详解
无赖H4于 2020-12-02 12:55:11 发布
一、用法
Sleep 函数可使计算机程序(进程、任务或线程)进入休眠状态,在指定时间内保持非活动状态。当函数设定的计时器到期、接收到信号或程序发生中断时,程序将恢复执行。
| 用法 | void Sleep(DWORD ms) |
|---|---|
| 单位 | 毫秒(ms) |
在 Windows 系统中,实现 1 秒休眠的代码如下:
Sleep(1000); // 休眠 1 秒
二、注意事项
- 在 Visual C++(VC)环境中,
Sleep函数名的首字母为大写S;在标准 C 中,函数名为sleep(首字母小写s)。具体使用形式需根据编译器类型确定,简言之:VC 编译器用Sleep,其他编译器一律用sleep。 Sleep函数的通用形式为Sleep(unsigned long);,其中参数单位为毫秒。若需实现 1 秒休眠,参数应设为1000,即Sleep(1000);。- 使用该函数需引入头文件
#include <windows.h>。
三、实例:多字符从两端向中间汇聚
通过定义两个字符数组,将目标字符数组的元素赋值给另一个数组,实现多字符从两端向中间汇聚的效果。
(一)无休眠状态
代码实现
// 演示多字符从两端移动,向中间汇聚(无休眠)
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "hello world";
char arr2[] = "###########";
int left = 0;
// strlen 用于计算数组长度,定义在 <string.h> 中;数组下标从 0 开始,故需减 1
int right = strlen(arr2) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
printf("%s\n", arr2);
}
return 0;
}

注意
此实现方式虽能得到最终结果,但字符汇聚过程瞬间完成,无法观察到逐步移动的效果。
(二)休眠实现(Sleep 函数)
代码实现
// 演示多字符从两端移动,向中间汇聚(含休眠)
#include <stdio.h>
#include <string.h>
#include <windows.h> // 引入 Sleep 函数所需头文件
int main()
{
char arr1[] = "hello world";
char arr2[] = "###########";
int left = 0;
int right = strlen(arr2) - 1;
while (left <= right)
{
Sleep(1000); // 程序休眠 1 秒
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
printf("%s\n", arr2);
}
return 0;
}

注意
截图无法体现 1 秒的休眠间隔,但 Sleep 函数确实使程序每步暂停 1 秒,可直观观察到字符逐步汇聚的过程。
(三)for 循环实现
上述功能也可通过 for 循环实现(能用 while 循环实现的逻辑通常也可通过 for 循环实现)。
代码实现
// 演示多字符从两端移动,向中间汇聚(for 循环 + 休眠)
#include <stdio.h>
#include <string.h>
#include <windows.h> // 引入 Sleep 函数所需头文件
int main()
{
char arr1[] = "hello world";
char arr2[] = "###########";
int left = 0;
int right = strlen(arr2) - 1;
// 循环初始化、条件判断、迭代操作分三行书写,增强可读性
for (left = 0, right = strlen(arr2) - 1;
left <= right;
left++, right--)
{
Sleep(1000); // 程序休眠 1 秒
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
}
return 0;
}

注意
该实例中,for 循环的条件表达式较长,可读性低于 while 循环。实际开发中,若循环条件简单,while 与 for 循环可任选;若循环条件复杂,建议优先使用 while 循环。
【C语言】Sleep()函数----详解
江池俊已于 2023-08-26 23:22:10 修改
一、前言
在 C 语言中,sleep 函数是实现程序延时功能的重要工具。无论是控制程序执行速度、模拟实时系统,还是创建交互式用户体验,sleep 函数均能发挥关键作用。它可使程序在指定时间间隔内暂停执行,期间释放处理器资源,提高系统资源利用率。
通过 sleep 函数,开发者可灵活控制程序执行节奏以适配不同场景:例如在游戏开发中实现流畅的动画效果,在多线程编程中协调不同线程的执行顺序,或在模拟实时系统时复现真实环境下的时间间隔。本文将详细介绍 sleep 函数的用法、注意事项及应用场景,为 C 语言初学者及有经验的开发者提供全面参考。
二、C语言 sleep 函数
C 语言中的 sleep 函数可使当前线程暂停执行指定时间,常用于模拟等待或延时操作。在 Windows、Linux 等主流操作系统中,sleep 函数的实现存在差异,但核心原理均为让线程进入睡眠状态以实现延时。
(一)基本语法
unsigned int sleep(unsigned int seconds);
(二)示例
#include <stdio.h>
#include <windows.h>
int main()
{
int a = 100;
Sleep(3000); // 程序暂停 3 秒后打印变量 a
printf("%d", a);
return 0;
}
(三)运行结果
(四)注意事项
- 参数类型限制:
sleep函数的参数类型为unsigned int(无符号整型),不支持浮点数。若需实现小于 1 秒的延时,可使用usleep函数,其参数单位为微秒(unsigned int),精度更高。 - 头文件差异:
- 在 VC 编译器(Windows 环境)中,需引入头文件
#include <windows.h>。 - 在 Linux 环境下,
gcc编译器需引入头文件#include <unistd.h>(具体头文件可能因gcc版本略有差异)。
- 在 VC 编译器(Windows 环境)中,需引入头文件
- 函数名与单位差异:
- VC 环境中,函数名为
Sleep(首字母大写S),参数单位为毫秒(ms),例如Sleep(1000);表示休眠 1 秒。 - Linux 环境及标准 C 中,函数名为
sleep(首字母小写s),参数单位为秒(s),例如sleep(1);表示休眠 1 秒。 - 简言之:VC 用
Sleep,其他环境一律用sleep。
- VC 环境中,函数名为
三、实例:多字符从两端向中间汇聚
(一)实现思路
定义两个字符数组,将目标字符数组(arr1)的元素逐步赋值给占位字符数组(arr2),实现字符从两端向中间汇聚的效果。
(二)无 sleep 函数的效果(while 循环实现)
代码展示
// 演示多字符从两端移动,向中间汇聚(无休眠,while 循环)
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
char arr1[] = "How are you?";
char arr2[] = "############";
int left = 0;
int right = strlen(arr1) - 1;
printf("%s\n\n", arr2);
// while 循环控制字符赋值与移动
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
printf("%s\n", arr2);
}
return 0;
}
运行结果

(三)有 sleep 函数的效果(while 循环实现)
代码展示
// 演示多字符从两端移动,向中间汇聚(含休眠,while 循环)
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
char arr1[] = "How are you?";
char arr2[] = "############";
int left = 0;
int right = strlen(arr1) - 1;
printf("%s\n\n", arr2);
// while 循环控制字符赋值与移动
while (left <= right)
{
Sleep(1000); // 增加休眠语句,实现 1 秒延时
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
printf("%s\n", arr2);
}
return 0;
}
运行结果
总结
上述两段代码的最终输出结果一致,但无 sleep 函数的代码会瞬间打印所有结果,而含 sleep 函数的代码会按 1 秒间隔逐步打印,可清晰观察到字符从两端向中间汇聚的过程。
(四)for 循环实现
代码展示
// 演示多字符从两端移动,向中间汇聚(含休眠,for 循环)
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
char arr1[] = "How are you?";
char arr2[] = "############";
int left = 0;
int right = strlen(arr1) - 1;
printf("%s\n\n", arr2);
// for 循环控制字符赋值与移动
for (left = 0, right = strlen(arr1) - 1; left <= right; left++, right--)
{
Sleep(1000); // 休眠 1 秒
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
}
return 0;
}
运行结果
while 语句与 for 语句的转换

C语言中的 sleep()
fgh431 已于 2022-10-28 22:08:25 修改
一、sleep() 函数的跨平台差异
sleep() 函数在 Windows 和 Linux 系统中为两个不同的函数,功能均为挂起进程指定时间,但接口与参数存在显著差异。
(一)Windows 系统下的 Sleep()
- 函数名:
Sleep()(首字母大写S)。 - 函数原型:
#include <windows.h> void Sleep(DWORD dwMilliseconds); - 参数说明:
DWORD dwMilliseconds,单位为毫秒(ms)。 - 示例代码:
#include <windows.h> // Windows 系统所需头文件 #include <stdio.h> int main() { int i; printf("你"); fflush(stdout); // 强制刷新输出缓冲区,确保内容即时显示 for (i = 0; i < 10; i++) { Sleep(1000); // Windows 系统使用 Sleep,参数单位为毫秒 printf("."); fflush(stdout); // 强制刷新缓冲区,即时显示小数点 } printf("好\n"); // 输出“你”与“好”之间间隔 10 秒,并依次输出 10 个“.” return 0; }
(二)Linux 系统下的 sleep()
- 函数名:
sleep()(首字母小写s)。 - 函数原型:
#include <unistd.h> unsigned int sleep(unsigned int seconds); - 参数说明:
unsigned int seconds,单位为秒(s);若需更精确的延时,可使用usleep()(单位:微秒)。 - 示例代码:
#include <unistd.h> // Linux 系统所需头文件 #include <stdio.h> int main() { int i; printf("你"); fflush(stdout); // 强制刷新输出缓冲区,确保内容即时显示 for (i = 0; i < 10; i++) { sleep(1); // Linux 系统使用 sleep,参数单位为秒 printf("."); fflush(stdout); // 强制刷新缓冲区,即时显示小数点 } printf("好\n"); // 输出“你”与“好”之间间隔 10 秒,并依次输出 10 个“.” return 0; }
二、补充说明
- 头文件差异:
- VC 编译器(Windows)需引入
<windows.h>。 - Linux 系统中,
gcc编译器需引入<unistd.h>(部分旧版本gcc可能需其他头文件,需根据实际版本调整)。
- VC 编译器(Windows)需引入
- 函数名与单位总结:
- VC 用
Sleep(大写S),参数单位为毫秒。 - Linux 及标准 C 用
sleep(小写s),参数单位为秒。 - 简言之:VC 用
Sleep,其他环境一律用sleep。
- VC 用
- usleep() 函数:
- 功能:挂起进程指定时间,单位为微秒(1 微秒 = 10⁻⁶ 秒)。
- 函数原型:
void usleep(int micro_seconds);。 - 注意:该函数已被标准废弃,建议使用
nanosleep()替代;且usleep()不支持 Windows 系统。 - 适用场景:延时需求为几十毫秒或更小时,使用
usleep()可更高效利用 CPU 资源;延时需求为秒级时,优先使用sleep()。
- delay() 函数:
- 功能:暂停程序执行指定时间,单位为毫秒(ms)。
- 函数原型:
void delay(unsigned milliseconds);。 - 与
sleep()的区别:delay()通过循环等待实现延时,进程仍占用 CPU 资源;sleep()会挂起进程,释放 CPU 资源给其他进程。
C语言中 usleep 与 nanosleep 函数讲解以及毫秒级休眠实现
HaiQinyanAN 已于 2024-02-29 21:30:16 修改
在 C 语言延时函数中,sleep 函数较为常用,本文将进一步介绍 usleep 和 nanosleep 函数,并基于 nanosleep 实现毫秒级休眠。
一、nanosleep 函数
(一)函数讲解
nanosleep 函数支持纳秒级(1 纳秒 = 10⁻⁹ 秒)延时,是 usleep 函数(微秒级)的底层实现基础,也可用于实现毫秒级延时。
1. 函数原型与头文件
#include <time.h>
int nanosleep(const struct timespec *req, struct timespec *rem);
- 参数
req:指向struct timespec类型的指针,用于设置所需休眠时间。 - 参数
rem:若rem不为NULL,则该指针指向的缓冲区将存储未完成的休眠时间(例如因信号中断导致提前唤醒时)。
2. timespec 结构体原型
struct timespec {
time_t tv_sec; /* 秒(seconds) */
long tv_nsec; /* 纳秒(nanoseconds),取值范围:0 ~ 999999999 */
};
(二)代码测试
通过 nanosleep 函数分别实现 5 秒和 1 秒的休眠,并周期性打印提示信息。
#include <stdio.h>
#include <time.h>
#define S 5 // 休眠时间:5 秒
#define NS 999999999 // 休眠时间:约 1 秒(999,999,999 纳秒)
int main(int argc, char *argv[])
{
struct timespec s_sleep; // 存储秒级休眠参数
struct timespec ns_sleep; // 存储纳秒级休眠参数
// 初始化 5 秒休眠参数
s_sleep.tv_sec = S;
// 初始化 1 秒(纳秒级)休眠参数
ns_sleep.tv_nsec = NS;
while (1)
{
nanosleep(&s_sleep, NULL);
printf("5 seconds passed...\n\n");
nanosleep(&ns_sleep, NULL);
printf("1 seconds passed...\n\n");
}
return 0;
}

运行结果显示,程序每 5 秒打印一次 5 seconds passed...,每 1 秒打印一次 1 seconds passed...,符合预期休眠时间。
二、usleep 函数
(一)函数原型与实现原理
1. 函数原型与头文件
#include <unistd.h>
int usleep(useconds_t usec);
- 参数
usec:useconds_t类型(实质为无符号整型),表示休眠时间,单位为微秒(1 微秒 = 10⁻⁶ 秒)。 - 返回值:成功返回 0,失败返回 -1。
2. 实现原理
usleep 函数的底层通过 nanosleep 函数实现,其核心逻辑是将微秒级参数转换为 timespec 结构体所需的“秒 + 纳秒”格式,代码如下:
#include <time.h>
#include <unistd.h>
int usleep(useconds_t useconds)
{
// 将微秒转换为“秒 + 纳秒”:1 秒 = 10^6 微秒,1 微秒 = 10^3 纳秒
struct timespec ts = {
.tv_sec = (long int)(useconds / 1000000),
.tv_nsec = (long int)(useconds % 1000000) * 1000ul
};
/* 注:usleep() 是线程取消点,但因调用的 nanosleep() 本身是取消点,故无需额外处理 */
return __nanosleep(&ts, NULL);
}
(二)代码测试
通过 usleep 函数实现 5 秒休眠,并周期性打印提示信息。
#include <stdio.h>
#include <unistd.h>
#define US 5000000 // 休眠时间:5 秒(5,000,000 微秒)
int main(int argc, char *argv[])
{
while (1)
{
usleep(US);
printf("5 seconds passed...\n");
}
return 0;
}

运行结果显示,程序每 5 秒打印一次 5 seconds passed...,符合预期休眠时间。
三、nanosleep 函数实现毫秒级函数
基于 nanosleep 函数的纳秒级精度,通过参数转换实现毫秒级(1 毫秒 = 10⁻³ 秒)休眠。
(一)实现思路
将毫秒级参数 ms 分解为“秒”和“纳秒”:
- 秒数:
ms / 1000(1 秒 = 1000 毫秒)。 - 纳秒数:
(ms % 1000) * 1000000(1 毫秒 = 10⁶ 纳秒)。
(二)代码实现
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#define MS_SLEEP 5000 // 休眠时间:5000 毫秒(即 5 秒)
// 毫秒级休眠函数:参数 ms 为休眠时间(毫秒)
void mssleep(unsigned long ms);
int main(int argc, char *argv[])
{
while (1)
{
mssleep(MS_SLEEP);
printf("5 seconds passed...\n");
}
return 0;
}
void mssleep(unsigned long ms)
{
struct timespec ts = {
.tv_sec = (long int)(ms / 1000), // 转换为秒
.tv_nsec = (long int)(ms % 1000) * 1000000ul // 转换为纳秒
};
nanosleep(&ts, NULL);
}

运行结果显示,程序每 5 秒打印一次 5 seconds passed...,表明毫秒级休眠功能实现成功。
实际开发中,也可直接通过 usleep 函数实现毫秒级休眠(例如 usleep(1000); 表示休眠 1 毫秒),但基于 nanosleep 实现的自定义函数可更灵活地适配不同精度需求。
【C/C++】Sleep()函数详解
修修修也 已于 2024-09-12 15:25:19 修改
一、Windows 系统下 Sleep() 函数简介
(一)函数功能
Sleep() 函数用于使计算机程序(进程、任务或线程)进入休眠状态,在指定时间内保持非活动状态。
(二)函数参数
函数仅含 1 个参数,原型如下:
void Sleep(DWORD milliseconds);
- 参数类型:
DWORD(实质为unsigned long,即无符号长整型)。 - 参数含义:接收以毫秒为单位的数值,表示程序暂停的时间。
(三)函数返回值
返回值类型为 void,即函数无返回值。调用后程序将暂停指定时间,时间结束后自动恢复执行。
(四)函数头文件
需引入头文件 <windows.h>。
(五)使用示例:倒计时程序
通过 Sleep() 函数实现 10 秒倒计时,每秒更新并打印剩余时间。
#include <stdio.h>
#include <windows.h>
// 倒计时函数:参数 n 为倒计时总秒数
void countdown(int n)
{
while (n >= 0)
{
printf("%-2d\r", n);
fflush(stdout); // 手动清空输出缓冲区(因使用 \r 换行,需强制刷新以显示内容)
Sleep(1000); // 暂停 1 秒(1000 毫秒)
n--;
}
printf("\n");
}
int main()
{
countdown(10); // 调用倒计时函数,设置倒计时为 10 秒
return 0;
}
运行结果
在 Visual Studio 2022 编译器中运行,程序将每秒打印 1 次剩余秒数,直至倒计时结束。
二、Linux 系统下 sleep() 函数简介
(一)函数功能
与 Windows 系统类似,sleep() 函数用于使程序(进程、任务或线程)进入休眠状态,暂停指定时间。
(二)函数参数
函数原型如下:
unsigned int sleep(unsigned int seconds);
- 参数类型:
unsigned int(无符号整型)。 - 参数含义:接收以秒为单位的数值,表示程序暂停的时间。
(三)函数返回值
返回值类型为 unsigned int,表示在指定时间内未完成休眠的秒数(例如因信号中断导致提前唤醒);若返回值为 0,则表示程序已完成指定时间的休眠。
(四)函数头文件
需引入头文件 <unistd.h>。
(五)使用示例:倒计时程序
通过 sleep() 函数实现 10 秒倒计时,每秒更新并打印剩余时间。
#include <stdio.h>
#include <unistd.h>
// 倒计时函数:参数 n 为倒计时总秒数
void countdown(int n)
{
while (n >= 0)
{
printf("%-2d\r", n);
fflush(stdout); // 手动清空输出缓冲区
sleep(1); // 暂停 1 秒(参数单位为秒)
n--;
}
printf("\n");
}
int main()
{
countdown(10); // 调用倒计时函数,设置倒计时为 10 秒
return 0;
}
运行结果
在 Xshell(操作系统:CentOS 7.9 64 位)中运行,程序将每秒打印 1 次剩余秒数,直至倒计时结束。
三、小 tips
- Linux 系统中,
sleep()函数可能因信号到达而提前返回,导致实际休眠时间短于指定时间;Windows 系统中,Sleep()函数通常不会被信号中断,更适合需精确休眠的场景。 - 若需在 Linux 中实现更精确的延时(如毫秒级),可使用
usleep()或nanosleep()函数。
via:
-
C 语言中的 Sleep 函数用法_c 语言中 sleep-优快云 博客
https://blog.youkuaiyun.com/mainpulate/article/details/6915041 -
Sleep() 函数的使用方法详解_sleep 函数 - 优快云 博客
https://blog.youkuaiyun.com/weixin_52142731/article/details/110477154 -
【C 语言】Sleep() 函数 ---- 详解_sleep 函数 - 优快云 博客
https://blog.youkuaiyun.com/2201_75743654/article/details/131784102 -
C 语言中的延时函数详解 - 优快云 博客
https://blog.youkuaiyun.com/zhoutianzi12/article/details/103438079 -
C 语言中 usleep 与 nanosleep 函数讲解以及毫秒级休眠实现 - 优快云 博客
https://blog.youkuaiyun.com/m0_51429770/article/details/128780994 -
【C/C++】Sleep() 函数详解_c++ sleep-优快云 博客
https://blog.youkuaiyun.com/weixin_72357342/article/details/141526664
4万+

被折叠的 条评论
为什么被折叠?



