首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

遇到棘手的有关问题,请高手帮忙解答

2013-09-14 
遇到棘手的问题,请高手帮忙解答!本帖最后由 lljl2009 于 2013-09-13 14:58:04 编辑功能描述:将进程A的stdo

遇到棘手的问题,请高手帮忙解答!
本帖最后由 lljl2009 于 2013-09-13 14:58:04 编辑 功能描述:
将进程A的stdout,stderr作为进程B的标准输入stdin,进程B中读取stdin并将读出的信息输出到stdout。


运行步骤:
1. run.sh中通过exec ./A 2>&1 | B 启动A和B;
2. A中可被触发一些printf信息(比如说检测到U盘的插入后会打印很多信息);
3. B中的处理:
char buffer[1024];
while(1)
{
        memset(buffer,0x0,sizeof(buffer));
        if(fgets(buffer, sizeof(buffer), stdin) && buffer[0] !='\n')
          bytes_read = strlen(buffer);
        else {
            printf("-----fgets stdin  <=0 -----\n");
              break;
        }
 //fflush(stdin);//no usable
        setvbuf(stdout, NULL, _IONBF, 0);
        //fwrite(buffer, bytes_read, 1, stdout);
        ret = fputs(buffer, stdout);
        if(ret == EOF)
            printf("===fputs to stdout error===\n");
        else
            fflush(stdout);
}

问题:
插入U盘后触发A打印信息,但是从stdout中看到最后一部分A的打印信息没有输出,需要等到stdout中再有数据的时候(例如重新拔插U盘触发A再次打印信息) 才能将上次剩余的打印信息“冲”出来。这到底是为什么?


已做的尝试:将fgets换成read也不行;在fgets前调用fcntl函数设置为O_NONBLOCK的方式也不行;getline也没有效果;......

请高手帮忙看看!多谢! 读取stdin的问题??
[解决办法]

引用:
Quote: 引用:

stdout有缓冲,可以用setbuf等函数将其设置为无缓冲,或者用fflush刷新输出缓冲区。
即,在A里调用
setbuf(stdout, NULL);
或者
fflush(stdout);
你说的fflush unusable是什么意思?

多谢回答! 意思是在B里面调用没起作用。。。 你的意思是在A里面调用吗?A自己输出到stdout没有问题的哦。。。那在A的什么地方调用呢?那么多打印信息



是在A中调用。A单独运行没问题,是因为printf的在输出时,对终端和重定向、管道等有不同的缓冲策略。
方法一:A在输出之前调用一次setbuf(stdout, NULL);将stdout设置为无缓冲,以后每次printf都可以立即输出。
方法二:A在输出之前调用setvbuf,将stdout设置为行缓冲,每次printf后面加一个换行符。
方法三:A在每次调用printf之后调用fflush(stdout);刷新输出缓冲区。

热点排行