【问题标题】:freopen not writing to the specified filefreopen 未写入指定文件
【发布时间】:2012-03-28 20:10:18
【问题描述】:

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

【问题讨论】:

标签: c++ linux stdout stderr freopen


【解决方案1】:

为了做你想做的事,我使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2014-12-12
    • 1970-01-01
    相关资源
    最近更新 更多