2012-07-19 87 views
11

可能重复:
Getting a FILE* from a std::fstream检索文件描述符:: fstream的

我在Linux和文件描述符工作在这个操作系统的主力机型。

我想知道是否有任何库或任何方式从C++ std::fstream开始检索本机Linux文件描述符。

我想过boost::iostream,因为有一个名为file_descriptor的类,但我明白它的目的与我想实现的不同。

你知道一些方法吗?

+1

为什么你需要的文件描述符? – 2012-07-19 10:06:46

+0

因为我会坚持使用Linux平台,所以我也期待NON-Standard。我也发现这个页面。任何人都使用过它?Anyhttp://www.ginac.de/~kreckel/fileno/ – 2012-07-19 10:20:08

+6

这个问题不是重复的。这个问题询问如何从iostream获取文件描述符。文件描述符是一个低级的内核概念。这个问题被指出,原来这被认为是重复的,说明FILE *流,这是不一样的。 – Daniel 2014-07-04 05:34:33

回答

5

你可以换个方式:实现你自己的流缓冲区,它包装一个文件描述符,然后用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. 
} 
2

在标准C++和libstdc++中都没有公开文件描述符的支持。

3

由于标准库没有规定如何实现文件流,所以没有(标准)方法从std :: fstream中提取文件编号。

相反,如果要执行此操作(使用FILE*),则需要使用C文件API。

3

没有官方的方式来获取文件流的私有文件句柄(或实际上是std::basic_filebuf),仅仅是因为它应该是可移植的并且不鼓励使用特定于平台的功能。

但是,你可以做像继承std::basic_filebuf丑陋的黑客攻击,并试图撬出文件句柄。这不是我推荐的,因为它可能会在不同版本的C++库中打破。