MyException - 我的异常网
当前位置:我的异常网» C语言 » while(一)死循环中加sleep后打印不输出

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

www.MyException.Cn  网友分享于:2013-02-21  浏览:68次
while(1)死循环中加sleep后打印不输出
问题描述参见下面的注释,请高手看下。

#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;
}

------解决方案--------------------
在printf的字串后加换行符试试
 {printf("%d \n",i);      sleep(3);                }

printf是行缓冲打印,它有一个buf,buf满或遇\n,打印输出

------解决方案--------------------
fflush(stdin)
------解决方案--------------------
引用:
在printf的字串后加换行符试试
 {printf("%d \n",i);      sleep(3);                }

printf是行缓冲打印,它有一个buf,buf满或遇\n,打印输出

printf遇换行不会清空缓冲区,应该用fflush(stdou);把在标准输出的缓冲区内荣全部打印出去
------解决方案--------------------
引用:
引用:在printf的字串后加换行符试试
 {printf("%d \n",i);      sleep(3);                }

printf是行缓冲打印,它有一个buf,buf满或遇\n,打印输出

引用:引用:在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);
------解决方案--------------------
在每个最后不带\n的printf后面加fflush(stdout);

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有