C语言 | Sleep 函数 / usleep 函数 / nanosleep 函数

注:本文为 “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;
}

使用该函数需注意以下两点:

  1. 必须引入头文件 <windows.h>
  2. Sleep 函数名中的首字母 S 需大写。

Sleep() 函数的使用方法详解

无赖H4于 2020-12-02 12:55:11 发布

一、用法

Sleep 函数可使计算机程序(进程、任务或线程)进入休眠状态,在指定时间内保持非活动状态。当函数设定的计时器到期、接收到信号或程序发生中断时,程序将恢复执行。

用法void Sleep(DWORD ms)
单位毫秒(ms)

在 Windows 系统中,实现 1 秒休眠的代码如下:

Sleep(1000); // 休眠 1 秒

二、注意事项

  1. 在 Visual C++(VC)环境中,Sleep 函数名的首字母为大写 S;在标准 C 中,函数名为 sleep(首字母小写 s)。具体使用形式需根据编译器类型确定,简言之:VC 编译器用 Sleep,其他编译器一律用 sleep
  2. Sleep 函数的通用形式为 Sleep(unsigned long);,其中参数单位为毫秒。若需实现 1 秒休眠,参数应设为 1000,即 Sleep(1000);
  3. 使用该函数需引入头文件 #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 循环。实际开发中,若循环条件简单,whilefor 循环可任选;若循环条件复杂,建议优先使用 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;
}

(三)运行结果

(四)注意事项

  1. 参数类型限制sleep 函数的参数类型为 unsigned int(无符号整型),不支持浮点数。若需实现小于 1 秒的延时,可使用 usleep 函数,其参数单位为微秒(unsigned int),精度更高。
  2. 头文件差异
    • 在 VC 编译器(Windows 环境)中,需引入头文件 #include <windows.h>
    • 在 Linux 环境下,gcc 编译器需引入头文件 #include <unistd.h>(具体头文件可能因 gcc 版本略有差异)。
  3. 函数名与单位差异
    • VC 环境中,函数名为 Sleep(首字母大写 S),参数单位为毫秒(ms),例如 Sleep(1000); 表示休眠 1 秒。
    • Linux 环境及标准 C 中,函数名为 sleep(首字母小写 s),参数单位为(s),例如 sleep(1); 表示休眠 1 秒。
    • 简言之:VC 用 Sleep,其他环境一律用 sleep

三、实例:多字符从两端向中间汇聚

(一)实现思路

定义两个字符数组,将目标字符数组(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;
}
运行结果

img

(三)有 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 语句的转换

img


C语言中的 sleep()

fgh431 已于 2022-10-28 22:08:25 修改

一、sleep() 函数的跨平台差异

sleep() 函数在 Windows 和 Linux 系统中为两个不同的函数,功能均为挂起进程指定时间,但接口与参数存在显著差异。

(一)Windows 系统下的 Sleep()

  1. 函数名Sleep()(首字母大写 S)。
  2. 函数原型
    #include <windows.h>
    void Sleep(DWORD dwMilliseconds);
    
  3. 参数说明DWORD dwMilliseconds,单位为毫秒(ms)。
  4. 示例代码
    #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()

  1. 函数名sleep()(首字母小写 s)。
  2. 函数原型
    #include <unistd.h>
    unsigned int sleep(unsigned int seconds);
    
  3. 参数说明unsigned int seconds,单位为秒(s);若需更精确的延时,可使用 usleep()(单位:微秒)。
  4. 示例代码
    #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;
    }
    

二、补充说明

  1. 头文件差异
    • VC 编译器(Windows)需引入 <windows.h>
    • Linux 系统中,gcc 编译器需引入 <unistd.h>(部分旧版本 gcc 可能需其他头文件,需根据实际版本调整)。
  2. 函数名与单位总结
    • VC 用 Sleep(大写 S),参数单位为毫秒。
    • Linux 及标准 C 用 sleep(小写 s),参数单位为秒。
    • 简言之:VC 用 Sleep,其他环境一律用 sleep
  3. usleep() 函数
    • 功能:挂起进程指定时间,单位为微秒(1 微秒 = 10⁻⁶ 秒)。
    • 函数原型:void usleep(int micro_seconds);
    • 注意:该函数已被标准废弃,建议使用 nanosleep() 替代;且 usleep() 不支持 Windows 系统。
    • 适用场景:延时需求为几十毫秒或更小时,使用 usleep() 可更高效利用 CPU 资源;延时需求为秒级时,优先使用 sleep()
  4. delay() 函数
    • 功能:暂停程序执行指定时间,单位为毫秒(ms)。
    • 函数原型:void delay(unsigned milliseconds);
    • sleep() 的区别:delay() 通过循环等待实现延时,进程仍占用 CPU 资源;sleep() 会挂起进程,释放 CPU 资源给其他进程。

C语言中 usleep 与 nanosleep 函数讲解以及毫秒级休眠实现

HaiQinyanAN 已于 2024-02-29 21:30:16 修改

在 C 语言延时函数中,sleep 函数较为常用,本文将进一步介绍 usleepnanosleep 函数,并基于 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);
  • 参数 usecuseconds_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

  1. Linux 系统中,sleep() 函数可能因信号到达而提前返回,导致实际休眠时间短于指定时间;Windows 系统中,Sleep() 函数通常不会被信号中断,更适合需精确休眠的场景。
  2. 若需在 Linux 中实现更精确的延时(如毫秒级),可使用 usleep()nanosleep() 函数。

via:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值