You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Rust的nix crate通过ioctl读取BLKSSZGET?

如何使用Rust的nix crate通过ioctl读取BLKSSZGET?

嘿,我来帮你把那段C代码转换成用Rust + nix crate实现的版本!思路和C里差不多,只是要贴合Rust的安全风格和nix的API设计:

首先,你得先在Cargo.toml里添上nix的依赖,记得带上需要的特性:

[dependencies]
nix = { version = "0.27", features = ["fs", "ioctl", "unistd"] }

接下来是具体的代码实现:

use nix::fcntl::{open, OFlag};
use nix::sys::ioctl::{ioctl_read, Ioctl};
use nix::unistd::close;
use std::os::unix::io::RawFd;

// 定义BLKSSZGET对应的ioctl操作,对应C里的_IO(0x12, 104)
ioctl_read!(blksszget, 0x12, 104, u64);

fn main() -> nix::Result<()> {
    // 打开CD-ROM设备文件,和C代码里的/dev/sr0对应
    let fd: RawFd = open(
        "/dev/sr0",
        OFlag::O_RDONLY,
        nix::sys::stat::Mode::empty()
    )?;

    let mut block_size = 0u64;
    // 调用生成的blksszget执行ioctl操作,因为直接和内核交互,所以需要unsafe块
    unsafe { blksszget(fd, &mut block_size) }?;

    println!("Block size: {}", block_size);

    // 别忘了关闭文件描述符
    close(fd)?;

    Ok(())
}

给你拆解下几个关键点:

  • ioctl_read!是nix提供的宏,专门用来生成读取型的ioctl函数,参数分别是生成的函数名、ioctl魔数(0x12是块设备的专属魔数)、命令号(104对应BLKSSZGET),还有要读取的数据类型(这里用u64是为了兼容不同平台的位数,和C里的long类型对应)
  • 打开设备用的nix::fcntl::open和C的open行为完全一致,返回的是RawFd(原始文件描述符)
  • 因为ioctl直接和内核交互,会操作原始指针,所以Rust要求必须用unsafe块包裹调用,这也是为了提醒你注意安全风险
  • 整个流程用了Rust的Result错误处理,比C里的printf错误提示更贴合Rust的安全风格

另外要注意,运行这个程序大概率需要root权限,毕竟访问块设备通常需要管理员权限才行哦!

备注:内容来源于stack exchange,提问作者user2011659

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:29:28