freopen没有写入指定的文件

时间:2012-03-28 20:10:19

标签: c++ linux stdout stderr freopen

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

以下是代码:

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”),没有输出的抑制剂但是不会写入文件。

1 个答案:

答案 0 :(得分: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