К сожалению, при просмотре стандарта ничего не предоставлено basic_filebuf
или любым из шаблонов классов basic_[io]?fstream
, которые позволили бы вам извлечь базовый дескриптор файла ОС (так, как fileno()
делает для C stdio I / O).
Также нет метода или конструктора open()
, который принимает такой дескриптор файла в качестве параметра (который позволил бы открыть файл с использованием другого механизма и записать дескриптор файла).
Существует basic_ostream::flush()
, однако я подозреваю, что это на самом деле не вызывает fsync()
- я ожидаю, что, как и fflush()
в stdio, он только гарантирует, что буферы библиотеки времени выполнения пользовательского пространства сбрасываются, Это означает, что ОС все еще может буферизовать данные.
Таким образом, в общем, кажется, нет способа сделать это переносимо. (
Что делать? Мое предложение подкласс basic_filebuf<C, T>
:
template <typename charT, typename traits = std::char_traits<charT> >
class my_basic_filebuf : public basic_filebuf<charT, traits> {
....
public:
int fileno() { ... }
....
};
typedef my_basic_filebuf<char> my_filebuf;
Чтобы использовать его, вы можете создать ofstream
, используя конструктор по умолчанию, а затем назначить новый буфер с помощью rdbuf()
:
my_filebuf buf;
buf.open("somefile.txt");
ofstream ofs;
ofs.rdbuf(&buf);
ofs << "Writing to somefile.txt..." << endl;
int fd = static_cast<my_filebuf*>(ofs.rdbuf())->fileno();
Конечно, вы также можете получить новый класс из basic_ostream
, чтобы сделать процесс открытия файла и извлечения его файлового дескриптора более удобным.