【问题标题】:Retrieving file descriptor from a std::fstream [duplicate]从 std::fstream 中检索文件描述符 [重复]
【发布时间】:2012-07-18 11:54:48
【问题描述】:

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

我在 Linux 上工作,文件描述符是这个操作系统的主要模型。

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

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

你知道有什么方法吗?

【问题讨论】:

  • 为什么需要文件描述符?
  • 我也在寻找非标准,因为我会坚持 Linux 平台。我也找到了这个页面。有人用过吗?任何http://www.ginac.de/~kreckel/fileno/
  • 这个问题不是重复的。这个问题询问如何从 iostream 获取文件描述符。文件描述符是一个低级内核概念。指出的问题是原来的问题,这应该是重复的,它谈到了 FILE * 流,它们是不一样的。
  • 相关(因为引用的重复不是重复本身):What's the difference between a file descriptor and file pointer?
  • 就个人而言,在执行写入后,我需要确定文件的大小 - 经常! file.seekg( 0, std::ios::end ); fsize = file.tellg(); file.seekg( 0, std::ios::end ); fsize = file.tellg() - fsize; 在某些文件系统上可能需要很长时间。同时,打开文件描述符上的fstat() 速度非常快。

标签: c++ fstream file-descriptor


【解决方案1】:

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

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

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

    【讨论】:

    • 这似乎使 C 在 Unix 系统编程方面优于 C++。
    【解决方案3】:

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

    但是,您可以进行丑陋的黑客攻击,例如继承 std::basic_filebuf 并尝试从中撬出文件句柄。这不是我推荐的东西,因为它可能会在不同版本的 C++ 库上中断。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-01-12
        • 2011-02-14
        • 2010-11-14
        • 2012-11-12
        • 2012-12-01
        • 2023-03-22
        • 1970-01-01
        相关资源
        最近更新 更多