从std :: fstream检索文件描述符

时间:2012-07-19 10:04:53

标签: c++ fstream file-descriptor

  

可能重复:
  Getting a FILE* from a std::fstream

我正在使用Linux,文件描述符是此操作系统的主要模型。

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

我想到了boost::iostream,因为有一个名为file_descriptor的类,但我明白它的目的与我想要达到的目的不同。

你知道某种方法吗?

4 个答案:

答案 0 :(得分:7)

您可以采用另一种方式:实现自己的包含文件描述符的流缓冲区,然后将其与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.
}

答案 1 :(得分:4)

没有(标准)方法从std :: fstream中提取文件号,因为标准库没有强制要求如何实现文件流。

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

答案 2 :(得分:3)

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

然而,你可以像继承std::basic_filebuf那样做丑陋的黑客攻击,并试图撬开文件句柄。它不是我推荐的东西,因为它可能会破坏不同版本的C ++库。

答案 3 :(得分:2)

不支持在标准C ++和libstdc++中公开文件描述符。