freopen未写入指定的文件

freopen not writing to the specified file

本文关键字:文件 freopen      更新时间:2023-10-16

我正在尝试使用一个文件重定向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"),并没有它输出的抑制器,但不会写入文件。

为了完成您想要做的事情,我使用了dup2(2)

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

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

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

和来自dup2的文档:

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

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

手册页注释

手册页分为几章。符号foo(N)表示第N章中名为"foo"的手册页。要打开foo(N),请键入:

$ man N foo

例如打开写(2)类型:

$ man 2 write