树莓派中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
相关产品推荐
相关产品推荐

