2

我正在尝试使用文件重定向 stdout 和 stderr 的输出。我正在使用 freopen,它会在正确的目录中创建文件,但文件是空白的。当我注释掉重定向标准输出和标准错误的代码时 - 输出显示在控制台上。

这是代码:

freopen(stderrStr.c_str(), "a+", stderr); //where stderrStr and stdoutStr are the path/file name
freopen(stdoutStr.c_str(), "a+", stdout);

fclose(stdout); 
fclose(stderr);

我在 main 中放置了一个 printf("I WORK") 并且没有它输出但不会写入文件的抑制剂。

4

1 回答 1

3

为了做你想做的事,我使用dup2(2)

只需打开(2)两个文件 fd1 和 fd2,然后dup2(fd1, 1)用于 stdout 和dup2(fd2, 2)stderr。

操作系统(libc、加载程序或内核,不确定是哪个)在 main 条目之前设置了 3 个打开的文件描述符:

0 : stdin pipe
1 : stdout pipe
2 : stderr pipe

并来自 dup2 的文档:

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

所以两个 dup2 调用将 1 和 2 替换为您打开的文件。因此,当您的进程调用write(2)(系统调用所有输出例程,如 printf 和 cout 调用)到 fd 1 或 fd 2 后,数据将写入您的文件而不是操作系统设置的管道

手册页注释

手册页分章节。符号foo(N)表示第 N 章中名称为“foo”的手册页。要打开 foo(N),请输入:

$ man N foo

例如打开 write(2) 类型:

$ man 2 write
于 2012-03-28T21:07:42.727 回答