这是不正确的使用popen(),printf和stdout或glibc中的错误?

时间:2013-06-23 18:58:31

标签: c glibc

我注意到我的程序使用函数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的错误或上面的代码中的错误。 我在我的实用程序中使用该重定向。 感谢您的任何建议。

3 个答案:

答案 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,...)电话时,不应有任何行为更改。