gpt4 book ai didi

c++ - 将 stdout/stderr 重定向到 unix c++ 下的文件 - 再次

转载 作者:可可西里 更新时间:2023-11-01 18:28:20 30 4
gpt4 key购买 nike

<分区>

我想做什么

将 stdout 和 stderr 从 c++ 内部重定向到一个或多个文件

为什么我需要它

我正在使用一个外部的、预编译的第三方库,它会产生大量的输出,我想将其重定向到一个日志文件以保持控制台干净。

条件

兼容性不是问题,代码只会在Unix系统上运行。重定向不仅会影响 C++ 风格的打印 ( std::cout << "hello world" << std::endl ),还会影响 C 风格的打印 ( printf("hello world\n") )。

到目前为止我尝试了什么

我在stackoverflow上浏览了半天,阅读了很多有类似问题的人的答案。在这些答案的帮助下,我已经能够将以下代码放在一起:


#include <stdio.h>
#include <iostream>
#include <fcntl.h>
#include "unistd.h"

const int stdoutfd(dup(fileno(stdout)));

int redirect_stdout(const char* fname){
fflush(stdout);
int newstdout = open(fname, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
dup2(newstdout, fileno(stdout));
close(newstdout);
}

int restore_stdout(){
fflush(stdout);
dup2(stdoutfd, fileno(stdout));
close(stdoutfd);
return stdoutfd;
}

int main(){
redirect_stdout("/dev/null");
std::cout << "invisible 1" << std::endl;
restore_stdout();
std::cout << "visible 1" << std::endl;
redirect_stdout("/dev/null");
std::cout << "invisible 2" << std::endl;
restore_stdout();
std::cout << "visible 2" << std::endl;
return 0;
}

我希望看到的:

visible 1
visible 2

我所看到的

visible 1

也就是说,当第一次使用这个机制时,它是有效的——但如果再次使用,恢复输出将不起作用。有人可以指出我需要更改哪些内容才能使该机制无限频繁地工作吗?

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com