我在Linux和文件描述符工作在这个操作系统的主力机型。
我想知道是否有任何库或任何方式从C++ std::fstream
开始检索本机Linux文件描述符。
我想过boost::iostream
,因为有一个名为file_descriptor
的类,但我明白它的目的与我想实现的不同。
你知道一些方法吗?
我在Linux和文件描述符工作在这个操作系统的主力机型。
我想知道是否有任何库或任何方式从C++ std::fstream
开始检索本机Linux文件描述符。
我想过boost::iostream
,因为有一个名为file_descriptor
的类,但我明白它的目的与我想实现的不同。
你知道一些方法吗?
你可以换个方式:实现你自己的流缓冲区,它包装一个文件描述符,然后用iostream
而不是fstream
来使用它。使用Boost.Iostreams可以使任务更容易。
不可移植的GCC的解决方案是:
#include <ext/stdio_filebuf.h>
{
int fd = ...;
__gnu_cxx::stdio_filebuf<char> fd_file_buf{fd, std::ios_base::out | std::ios_base::binary};
std::ostream fd_stream{&fd_file_buf};
// Write into fd_stream.
// ...
// Flushes the stream and closes fd at scope exit.
}
在标准C++和libstdc++
中都没有公开文件描述符的支持。
由于标准库没有规定如何实现文件流,所以没有(标准)方法从std :: fstream中提取文件编号。
相反,如果要执行此操作(使用FILE*
),则需要使用C文件API。
没有官方的方式来获取文件流的私有文件句柄(或实际上是std::basic_filebuf
),仅仅是因为它应该是可移植的并且不鼓励使用特定于平台的功能。
但是,你可以做像继承std::basic_filebuf
丑陋的黑客攻击,并试图撬出文件句柄。这不是我推荐的,因为它可能会在不同版本的C++库中打破。
为什么你需要的文件描述符? – 2012-07-19 10:06:46
因为我会坚持使用Linux平台,所以我也期待NON-Standard。我也发现这个页面。任何人都使用过它?Anyhttp://www.ginac.de/~kreckel/fileno/ – 2012-07-19 10:20:08
这个问题不是重复的。这个问题询问如何从iostream获取文件描述符。文件描述符是一个低级的内核概念。这个问题被指出,原来这被认为是重复的,说明FILE *流,这是不一样的。 – Daniel 2014-07-04 05:34:33