遇到棘手的问题,请高手帮忙解答!
本帖最后由 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的问题??
[解决办法]
是在A中调用。A单独运行没问题,是因为printf的在输出时,对终端和重定向、管道等有不同的缓冲策略。
方法一:A在输出之前调用一次setbuf(stdout, NULL);将stdout设置为无缓冲,以后每次printf都可以立即输出。
方法二:A在输出之前调用setvbuf,将stdout设置为行缓冲,每次printf后面加一个换行符。
方法三:A在每次调用printf之后调用fflush(stdout);刷新输出缓冲区。