我正在尝试使用文件重定向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”),没有输出的抑制剂但是不会写入文件。
答案 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