Получение файлового дескриптора из std:: fstream

Возможный дубликат:
Получение FILE * из std:: fstream

Я работаю над Linux, и файловые дескрипторы являются основной моделью в этой ОС.

Мне было интересно, есть ли какая-либо библиотека или какой-либо способ получить собственный дескриптор файла Linux, начиная с С++ std::fstream.

Я думал о boost::iostream, так как есть класс под названием 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*).

Ответ 3

Нет официального способа получить дескриптор частного файла потока файлов (или актуально std::basic_filebuf), только потому, что он должен быть переносимым и препятствовать использованию специфичных для платформы функций.

Однако вы можете сделать уродливое взломать, как наследование std::basic_filebuf, и от этого попытаться вырвать дескриптор файла. Это не то, что я рекомендую, так как он, вероятно, сломается на разных версиях библиотеки С++.

Ответ 4

Нет поддержки раскрытия дескриптора файла ни в стандартном С++, ни в libstdc++.