是否有(理想情况下简单而优雅)记录stdin
和stdout
的方法?
请注意,我不打算重定向流。我希望标准流保持功能以与其他软件通信,同时还要将所有进程间通信写入某个文件。
答案 0 :(得分:1)
与@PaulR suggests一样,您可以使用诸如tee(在Linux / Mac / Unix上)之类的外部进程,也可以编写自己的进程以循环方式从stdin读取并写入stdout和另一个文件。
很多年前,我用std::basic_ios::rdbuf来制作std::cout
。要做的就是定义一个类(请参见std::filebuf
和std::streambuf
):
class tee_buf : public std::filebuf {
public:
// Not an owing pointer
tee_buf(std::streambuf * other_stream)
: m_other_stream(other_stream) {}
void swap( tee_buf& rhs );
// No need to override open/close since we need to manage only the file.
// The open/close calls don't touch the other_stream.
protected:
int_type overflow(int_type c = traits_type::eof()) override;
// The parent calls this->overflow(), but then still need to call
// m_other_stream->sync(). This is problematic since m_other_stream
// gets flushed twice.
int sync() override;
pos_type seekoff( off_type off,
std::ios_base::seekdir dir,
std::ios_base::openmode which) override {
return pos_type(off_type(-1)); // ???
}
pos_type seekpos( pos_type sp,
std::ios_base::openmode which) override {
return pos_type(off_type(-1)); // ???
}
....
这对于密集型IO更为有效,因为它避免了中间人。但是在大多数情况下,三通解决方案更简单,更可取。如果性能是一个问题(在大多数情况下不是问题),则可以使两个流缓冲区共享一个内存缓冲区。也可以使用异步IO并行写入两个流。
有内存泄漏的用法:
std::cout.rdbuf(new tee_buf(std::cout.rdbuf());
没有内存泄漏的用法:
编写一个RAII类以包含tee_buf
,以保存原始文本并设置新的std::cout.rdbuf()
。销毁后,恢复std::cout.rdbuf()
的状态。制作一个此类的实例,它将在构造和破坏该类时进行肮脏的工作。
对于C样式stdout
:我不认为有一种方法可以覆盖其行为。最多可以使用缓冲存储器,但这还不足以获得所需的功能。使用stdout
唯一可以做的就是使用类似tee
的解决方案。
答案 1 :(得分:0)
It should be fairly simple to this do with tee
. This would allow you to maintain any existing redirection while also sending stdin/stdout elsewhere (to files in your case). This also avoids having to make any modifications to your existing code.