You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派中POSIX C/C++的sleep()与usleep()函数异常问题求助

问题分析与解决

核心问题定位

你遇到的sleep()和usleep()异常,本质是标准输出缓冲导致的视觉假象,并非睡眠函数真的失效。printf()默认采用行缓冲模式,当输出内容不带换行符时,数据会暂存到缓冲区而不会立即打印到终端,让你误以为sleep()没执行或者程序卡住。

解决方法

针对该问题,有三种直接可行的解决方式:

1. 在printf后添加换行符

修改测试代码,在输出末尾加上\n,强制触发缓冲区刷新:

#include <stdio.h>
#include <unistd.h>

int main()
{
    while (1) // 注意:C标准中没有内置true,用1替代可避免编译警告
    {
        sleep(1);
        printf("%.2f\n", 10.1); // 添加换行符
    }
}

2. 手动刷新标准输出缓冲区

如果不想添加换行符,可调用fflush(stdout)强制输出缓冲区内容:

#include <stdio.h>
#include <unistd.h>

int main()
{
    while (1)
    {
        sleep(1);
        printf("%.2f", 10.1);
        fflush(stdout); // 手动刷新缓冲区
    }
}

3. 禁用标准输出缓冲

在程序开头调用setbuf(stdout, NULL),直接关闭标准输出的缓冲功能:

#include <stdio.h>
#include <unistd.h>

int main()
{
    setbuf(stdout, NULL); // 关闭缓冲区
    while (1)
    {
        sleep(1);
        printf("%.2f", 10.1);
    }
}

额外注意点

  • usleep()已被标记为废弃函数,推荐使用nanosleep()替代,精度更高且兼容性更好,示例用法:
    struct timespec req = {1, 0}; // 1秒0纳秒
    nanosleep(&req, NULL);
    
  • 树莓派GPIO控制场景中,若需要精确延时,建议使用硬件定时器或wiringPi/pigpio库提供的专用延时函数,比标准库函数更可靠。

内容的提问来源于stack exchange,提问作者Luks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:40:55