我在Linux和文件描述符工作在這個操作系統的主力機型。
我想知道是否有任何庫或任何方式從C++ std::fstream
開始檢索本機Linux文件描述符。
我想過boost::iostream
,因爲有一個名爲file_descriptor
的類,但我明白它的目的與我想實現的不同。
你知道一些方法嗎?
我在Linux和文件描述符工作在這個操作系統的主力機型。
我想知道是否有任何庫或任何方式從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.
}
在標準C++和libstdc++
中都沒有公開文件描述符的支持。
由於標準庫沒有規定如何實現文件流,所以沒有(標準)方法從std :: fstream中提取文件編號。
相反,如果要執行此操作(使用FILE*
),則需要使用C文件API。
沒有官方的方式來獲取文件流的私有文件句柄(或實際上是std::basic_filebuf
),僅僅是因爲它應該是可移植的並且不鼓勵使用特定於平臺的功能。
但是,你可以做像繼承std::basic_filebuf
醜陋的黑客攻擊,並試圖撬出文件句柄。這不是我推薦的,因爲它可能會在不同版本的C++庫中打破。
爲什麼你需要的文件描述符? – 2012-07-19 10:06:46
因爲我會堅持使用Linux平臺,所以我也期待NON-Standard。我也發現這個頁面。任何人都使用過它?Anyhttp://www.ginac.de/~kreckel/fileno/ – 2012-07-19 10:20:08
這個問題不是重複的。這個問題詢問如何從iostream獲取文件描述符。文件描述符是一個低級的內核概念。這個問題被指出,原來這被認爲是重複的,說明FILE *流,這是不一樣的。 – Daniel 2014-07-04 05:34:33