2

我注意到我的程序使用函数 popen 并重新分配标准输出因 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 的错误还是上面代码中的错误。我在我的实用程序中使用该重定向。感谢您的任何建议。

4

3 回答 3

0

fflush(stdout)在 popen 之前尝试

于 2013-06-23T20:20:20.267 回答
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,...)

于 2013-06-23T21:34:35.190 回答
0

注释掉 fprintf() 并查看您的第一个和第二个 printf() 的行为方式是否相同。我的猜测是 fprintf() 在库数据结构中做了一些意想不到的事情。

于 2013-06-23T20:00:51.070 回答