flock-ing a C++ ifstream on Linux (GCC 4.6)

后端 未结 4 361
终归单人心
终归单人心 2021-01-13 04:39

context

I\'m slowly writing a specialized web server application in C++ (using the C onion http server library and the JSONCPP library for JSON serialization, if t

4条回答
  •  说谎
    说谎 (楼主)
    2021-01-13 04:42

    A deficiency with the filestream API is that you cannot (at least not easily) access the file descriptor of an fstream (see here and here, for example). This is because there is no requirement that fstream is implemented in terms of FILE* or file descriptors (though in practice it always is). This is also required for using pipes as C++ streams.

    Therefore the 'canonical' answer (as implied in the comments to the question) is:

    create a stream buffer (derived from std::basic_streambuf) that uses Posix and C stdio I/O functions (i.e open etc) and thus gives access to the file descriptor.

    Create your own 'LockableFileStream' (derived from std::basic_iostream) using your stdio based stream buffer instead of std::streambuf.

    You may now have a fstream like class from which you may gain access to the file descriptor and thus use fcntl (or lockf) as appropriate.

    There are a few libraries which provide this out of the box.

    I had thought this was addressed partly now that we've reached C++17 but I can't find the link so I must have dreamed it.

提交回复
热议问题