我正在尝试使用文件重定向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"),没有了它输出的抑制器,但不会写到文件中。
发布于 2012-03-29 05:07:43
为了完成你想做的事情,我使用了dup2(2)。
只需打开(2)两个文件fd1和fd2,然后使用dup2(fd1, 1)表示标准输出,使用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调用)之后,数据将被写入文件,而不是操作系统设置的管道
手册页注释
手册页以章节的形式出现。注释 foo( N ) 表示N章中名称为"foo“的手册页。要打开foo(N)类型:
$ man N foo例如,要打开write(2),请键入:
$ man 2 writehttps://stackoverflow.com/questions/9914907
复制相似问题