日期:2014-05-16  浏览次数:20779 次

遇到棘手的问题,请高手帮忙解答!
本帖最后由 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的什么地方调用呢?那么多打印信息