Rust 中 libc::stat 中的文件参数
File-argument in libc::stat in Rust
我很难用 Rust 调用 libc::stat
。我有这个:
extern crate libc;
use std::fs::File;
use std::os::unix::prelude::*;
use std::path::Path;
fn main() {
let p = Path::new("/");
let f = File::open(&p).unwrap();
let fd = f.as_raw_fd() as i8;
unsafe {
let mut stat: libc::stat = std::mem::zeroed();
if libc::stat(fd, &mut stat) >= 0 {
println!("{}", stat.st_blksize);
}
}
}
但现在我收到此错误:error: mismatched types: expected *const i8, found i8
我找不到关于第一个参数如何工作的任何文档。从类型来看(i8
)我以为一定是文件描述符
背景:我正在通读 "Advanced Programming in the UNIX Environment" 并且想用 Rust 而不是 C 做一些练习。
stat
is the file path as a C string. C strings are represented in Rust by CStr
(borrowed) or CString
的第一个参数(拥有)。这是一个使用 CString
:
的例子
extern crate libc;
use std::ffi::CString;
fn main() {
unsafe {
let root = CString::new("/").unwrap();
let mut stat: libc::stat = std::mem::zeroed();
if libc::stat(root.as_ptr(), &mut stat) >= 0 {
println!("{}", stat.st_blksize);
}
}
}
查看 Rust Book 的 FFI chapter 了解其他信息。
我很难用 Rust 调用 libc::stat
。我有这个:
extern crate libc;
use std::fs::File;
use std::os::unix::prelude::*;
use std::path::Path;
fn main() {
let p = Path::new("/");
let f = File::open(&p).unwrap();
let fd = f.as_raw_fd() as i8;
unsafe {
let mut stat: libc::stat = std::mem::zeroed();
if libc::stat(fd, &mut stat) >= 0 {
println!("{}", stat.st_blksize);
}
}
}
但现在我收到此错误:error: mismatched types: expected *const i8, found i8
我找不到关于第一个参数如何工作的任何文档。从类型来看(i8
)我以为一定是文件描述符
背景:我正在通读 "Advanced Programming in the UNIX Environment" 并且想用 Rust 而不是 C 做一些练习。
stat
is the file path as a C string. C strings are represented in Rust by CStr
(borrowed) or CString
的第一个参数(拥有)。这是一个使用 CString
:
extern crate libc;
use std::ffi::CString;
fn main() {
unsafe {
let root = CString::new("/").unwrap();
let mut stat: libc::stat = std::mem::zeroed();
if libc::stat(root.as_ptr(), &mut stat) >= 0 {
println!("{}", stat.st_blksize);
}
}
}
查看 Rust Book 的 FFI chapter 了解其他信息。