遇到棘手的问题,请高手帮忙解答!
本帖最后由 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也没有效果;......
请高手帮忙看看!多谢!
------解决方案--------------------