Получение файлового дескриптора из 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++
.