C中的输出重定向

时间:2017-02-18 15:03:15

标签: c linux

我正在尝试在C(./a.out > out.log)中重定向输出,我希望printf打印到文件而不是stdout,由于某种原因我无法实现,我也无法理解是什么' copy'表示在linux手册的dup2描述中:

  

dup2()使newfd成为oldfd的副本,首先关闭newfd   必要

复制是指重定向吗?

感谢您的帮助。

#include <stdio.h>
#include <unistd.h>

int main(){
  FILE *fout=fopen("out.log","wt");
  if(!fout)
    return 1;

  printf("Hi stdout\n");

  if(dup2(fileno(fout),fileno(stdout) == -1)) return 1;

  printf("Hi file\n");

  fclose(fout);

  return 0;
}

1 个答案:

答案 0 :(得分:2)

是的,这是一种重定向方式。除了拼写错误之外,您的代码将起作用:

你正在使用编号为fileno(stdout) == -1的fd;由于stdout最初是打开文件描述符1,因此比较为1 == -1,这是假的;即0,你最终通过标准输入而不是标准输出重复新文件描述符。

显然代码应该是:

// notice the parentheses here      v
if (dup2(fileno(fout),fileno(stdout)) == -1) return 1;

附录,你可能会想要在啜饮之前fflush stdout,只是为了确定 - 因为stdout可能不是行缓冲的。

使用freopen重新打开stdout更容易,但这只会重定向stdio函数的输出,而不是unix系统调用或子进程的输出。