首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >freopen没有写入指定的文件

freopen没有写入指定的文件
EN

Stack Overflow用户
提问于 2012-03-29 04:10:19
回答 1查看 1.2K关注 0票数 2

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

代码如下:

代码语言:javascript
复制
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"),没有了它输出的抑制器,但不会写到文件中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-29 05:07:43

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

只需打开(2)两个文件fd1和fd2,然后使用dup2(fd1, 1)表示标准输出,使用dup2(fd2, 2)表示标准错误。

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

代码语言:javascript
复制
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调用)之后,数据将被写入文件,而不是操作系统设置的管道

手册页注释

手册页以章节的形式出现。注释 foo( N ) 表示N章中名称为"foo“的手册页。要打开foo(N)类型:

代码语言:javascript
复制
$ man N foo

例如,要打开write(2),请键入:

代码语言:javascript
复制
$ man 2 write
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9914907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档