while(1)死循环中加sleep后打印不输出

heronism 2013-01-26 12:15:52
问题描述参见下面的注释,请高手看下。

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

int main(int argc, char* argv[])
{
while(1)
{
log("abc");//用的是so中的接口,相当于输出abc
printf("%d", add_(3,4));////用的是so中的接口,相当于打印出7
/* 用gcc编出test,然后./test,本应每3s循环打印abc7 */
/* 实际运行情况是,程序挂住,无任何显示 */
/* log与add函数没问题,去掉下面的sleep后就能循环打印出abc7 */
sleep(3);
}

return 0;
}
...全文
1106 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
china_jeffery 2013-01-29
  • 打赏
  • 举报
回复
哈哈,Sleep能接受的值最小为10,你Sleep(5)其实等同于Sleep(0),死循环,卡死了
赵4老师 2013-01-28
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout);
Cody2k3 2013-01-27
  • 打赏
  • 举报
回复 1
引用 7 楼 heronism 的回复:
引用 1 楼 c1997sdn 的回复:在printf的字串后加换行符试试 {printf("%d \n",i); sleep(3); } printf是行缓冲打印,它有一个buf,buf满或遇\n,打印输出 引用 5 楼 hnwyllmm 的回复:引用 1 楼 c1997sdn 的回复:在printf的字串后加换行……
这两位说的并不矛盾,角度不同。 printf是建立在stdout(fd=1)之上的程序,它的buffer行为取决于stdout对应的设备的类型 在普通我们console输出的情况下,它使用的line buffer,也就是遇到换行就会自动进行write(1,...)的操作 如果目标设备是pipe例如redirect 到文件的情况下,那么实际上printf会做full buffering,也就是buf 满了才flush 所以楼主可以试试即使是在使用printf("..\n"...)的情况下,如果redirect到file是不能立刻看到file update的(或者楼主如果会使用tee的话) 很多平台上缺省buffer size=1024,所以在输出到console并且不打换行符的情况下,大概loop 1024次就可以看到所有的7输出,这个和楼主的观察是一致的 基于这个理解可以给楼主提供其他几个方案(假设楼主使用console做输出) a.直接使用write(1, &char c='7',1) b.改变 stdout缺省buffer为无buffer,在程序开始call setvbuf(stdout, (char *) NULL, _IOLBF, 0);
derekrose 2013-01-26
  • 打赏
  • 举报
回复
fflush(stdin)
c1997sdn 2013-01-26
  • 打赏
  • 举报
回复
另外,linux下还有个delay()函数,原型为extern void delay(unsigned int msec);它可以延时msec*4毫秒,也就是如果想延时3秒钟的话,可以试试 delay(750);
c1997sdn 2013-01-26
  • 打赏
  • 举报
回复
在printf的字串后加换行符试试 {printf("%d \n",i); sleep(3); } printf是行缓冲打印,它有一个buf,buf满或遇\n,打印输出
羽飞 2013-01-26
  • 打赏
  • 举报
回复
引用 1 楼 c1997sdn 的回复:
在printf的字串后加换行符试试 {printf("%d \n",i); sleep(3); } printf是行缓冲打印,它有一个buf,buf满或遇\n,打印输出
printf遇换行不会清空缓冲区,应该用fflush(stdou);把在标准输出的缓冲区内荣全部打印出去
AIGPTchina 2013-01-26
  • 打赏
  • 举报
回复
请问你想干嘛?
heronism 2013-01-26
  • 打赏
  • 举报
回复
引用 1 楼 c1997sdn 的回复:
在printf的字串后加换行符试试 {printf("%d \n",i); sleep(3); } printf是行缓冲打印,它有一个buf,buf满或遇\n,打印输出
引用 5 楼 hnwyllmm 的回复:
引用 1 楼 c1997sdn 的回复:在printf的字串后加换行符试试 {printf("%d \n",i); sleep(3); } printf是行缓冲打印,它有一个buf,buf满或遇\n,打印输出 printf遇换行不会清空缓冲区,应该用fflush(stdou);把在标准输出的缓冲区内荣全部打印出去 ……
两位说的方法都可行,感谢。 可我还是没搞懂,确实因为printf满行才输出,如果把每次输出的字符变长,并且把睡眠时间调短的话,等一会确实能看到输出。
AnYidan 2013-01-26
  • 打赏
  • 举报
回复
add_(3,4) 换成一个 int 试试

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧