如何在 Rust 中编写绑定到需要打开文件句柄的 C 函数?
How can I write binding to a C function that expects an open file handle in Rust?
我以前玩过用 Rust 编写库绑定,并不难。然而,现在,我被困住了:我正在尝试为 librsync 编写一个绑定,它的一些函数希望您传递一个打开的文件句柄(C 中的 FILE*
)。
对于基本类型,有一种直接的方法可以将它们传递到 C 中(对于基本类型的指针也是如此)。而且,需要明确的是,我知道 libc
crate 实现了 fopen
,这反过来又给了我一个 mut FILE*
(最终会完成这项工作)。但是,我想知道 Rust 标准库中是否有一些东西可以让我将 FILE*
传递给 librsync
— 也许类似于 std::ffi::CString
.
你当然可以使用 RawFd
,用它转化并调用 libc::funcs::posix88::stdio::fdopen(_, mode)
。不过那将是非常不可移植的。
cfile (crate docs) looks like a lightweight wrapper around libcs FILE* that implements the io::Read/Write/Seek 个特征。
我以前玩过用 Rust 编写库绑定,并不难。然而,现在,我被困住了:我正在尝试为 librsync 编写一个绑定,它的一些函数希望您传递一个打开的文件句柄(C 中的 FILE*
)。
对于基本类型,有一种直接的方法可以将它们传递到 C 中(对于基本类型的指针也是如此)。而且,需要明确的是,我知道 libc
crate 实现了 fopen
,这反过来又给了我一个 mut FILE*
(最终会完成这项工作)。但是,我想知道 Rust 标准库中是否有一些东西可以让我将 FILE*
传递给 librsync
— 也许类似于 std::ffi::CString
.
你当然可以使用 RawFd
,用它转化并调用 libc::funcs::posix88::stdio::fdopen(_, mode)
。不过那将是非常不可移植的。
cfile (crate docs) looks like a lightweight wrapper around libcs FILE* that implements the io::Read/Write/Seek 个特征。