web-dev-qa-db-ja.com

std :: fstreamからファイル記述子を取得しています

重複の可能性:
std :: fstreamからファイル*を取得

私はLinuxに取り組んでおり、ファイル記述子がこのOSのメインモデルです。

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.
}
8

ファイルストリームのプライベートファイルハンドル(または実際には std::basic_filebuf )を取得する公式の方法はありません。これは、移植可能であり、プラットフォーム固有の関数の使用を推奨しないためです。

ただし、std::basic_filebufを継承するような醜いハックを実行し、そこからファイルハンドルをこじ開けようとすることができます。おそらくC++ライブラリの異なるバージョンで壊れるので、私がお勧めするものではありません。

標準ライブラリはファイルストリームの実装方法を義務付けていないため、std :: fstreamからファイル番号を抽出する(標準の)方法はありません。

むしろ、これを実行する場合は、CファイルAPIを使用する必要があります(FILE*を使用)。

4
Hampus Nilsson

標準のC++でもlibstdc++でもファイル記述子を公開することはサポートされていません。

2
Artyom