我注意到我的程序使用函数popen 并重新分配stdout与printf函数失败
代码:
# include <stdio.h>
int main(int argc, char * argv[])
{
FILE * tmp = stdout;
char * command = "cat > newfile.txt";
double a=12.2344;
stdout = popen( command, "w"); /* permitted according to glibc tutorial */
printf("That was laddy\n"); /* This doesn't go to newfile.txt !!!*/
fprintf(stdout, "And his lass\n"); /* but This goes */
/* but this...... */
printf("A double number: %.2f\n", a); /* unexpectedly goes where the
first printf hasn't gone */
/* is it a bug or there is something wrong in a code ? */
pclose(stdout);
stdout = tmp;
return 0;
}
什么是printf功能?有一次它打印在tty但下次 提交'newfile.txt'(应该在哪里)。 它是glibc的错误或上面的代码中的错误。 我在我的实用程序中使用该重定向。 感谢您的任何建议。
答案 0 :(得分:0)
注释掉fprintf()并查看第一个和第二个printf()的行为是否相同。我的猜测是fprintf()在库数据结构中做了一些意想不到的事情。
答案 1 :(得分:0)
在popen之前尝试使用fflush(stdout)
答案 2 :(得分:0)
这显然是glibc中的一个错误。我可以在带有Linux内核3.0.0-32-generic的x86 Ubuntu上重现你用libc 2.13描述的行为。
如果我使用等效的printf()
替换第一次调用fprintf(stdout,"That was laddy\n");
,则所有输出都会转到newfile.txt
文件。
由于printf()
是根据fprintf(stdout,...)
定义的,因此在将printf(...)
电话转换为fprintf(stdout,...)
电话时,不应有任何行为更改。