重定向stdout / stderr以在C中运行

时间:2016-06-11 06:20:16

标签: c function redirect stdout

我想将stdout和stderr重定向到一个函数并编写一个简单的代码。 fprintf没问题但是当我使用没有\ r的printf时,流传递给终端!

#include <stdio.h>
static ssize_t file_write(void *c, const char *buf, size_t size)
{
  FILE * pFile;
  pFile = fopen ("output.txt","w");
  fprintf(pFile, "%s", buf);
  fclose (pFile);

return size;
}

void redirect()
{
  FILE *stream;
  stream=fopencookie(NULL, "w", (cookie_io_functions_t) {(ssize_t) 0,  file_write, 0, 0});
  setbuf(stdout, NULL);
  stdout = stream;
  setbuf(stderr, NULL);
  stderr = stream;
}

int main()
{
  redirect();
  fprintf(stderr,"1-stderr test\n");
  fprintf(stdout, "2-stdout test\n");
  printf("3-printf with r test\n\r");
  printf("4-printf without r test\n");

return 0;
}

file&#34; output.txt&#34;:

  

1-stderr测试
  2-stdout测试
  带有r测试的3-printf

终端输出:

  

$ ./sample
  没有r测试的4-printf

1 个答案:

答案 0 :(得分:1)

您无法重定向&#34;标准输入,或标准输出到程序中的功能。

然而,您可以创建一对管道并用这些管道替换标准输入和输出,并且具有另一个功能(可能在另一个线程甚至子进程中)使用管道的另一端与该功能进行通信。 / p>

你当然可以使用例如setvbufstdinstdout的缓冲区更改为您提供的一对缓冲区,然后您可以像任何其他内存缓冲区(即数组)一样直接读取或直接写入缓冲区)。不过我推荐它,它很脆弱,容易出错。

但是在这种情况下,您似乎想要的是所有写入stdout的内容都应该转到文件中。在这种情况下(如使用管道),没有标准的C方式来处理它,但您需要使用特定于操作系统的功能。然后,如果您在POSIX平台(如Linux或OSX)上,您可以告诉操作系统复制文件的基础文件描述符,并说STDOUT_FILNO(这是用于{的文件描述符) {1}})是您打开的文件的文件描述符的副本。然后,对stdout的所有写入都将写入您的文件。为此,您需要使用the dup2 system call