我正在尝试使用文件重定向 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).
Simply open(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 替换为您打开的文件。所以当你的进程调用之后write(2)(系统调用所有输出例程,例如 printf 和 cout 调用)到 fd 1 或 fd 2 数据将写入您的文件而不是操作系统设置的管道
手册页注释:
手册页分为章节。符号foo(N)表示第 N 章中名为“foo”的手册页。要打开 foo(N),请输入:
$ man N foo
例如打开 write(2) 类型:
$ man 2 write
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)