5 个版本
使用旧的 Rust 2015
0.6.2 | 2024 年 4 月 23 日 |
---|---|
0.6.1 | 2021 年 3 月 16 日 |
0.6.0 | 2020 年 11 月 17 日 |
0.5.1 | 2016 年 9 月 18 日 |
0.5.0 | 2016 年 9 月 13 日 |
#272 在 Unix API 中
每月 150 次下载
96KB
1K SLoC
ioctl-sys
& ioctls
Rust 中绑定 ioctl 的辅助工具。目前支持除 SPARC 和 Alpha 以外的所有架构上的 Linux。其他平台欢迎加入!
ioctl-sys
crate 提供了一个基本的接口来编写自己的 ioctl 包装器。
ioctls
crate 为大量的 ioctl 提供了包装器。
这个库相当低级且杂乱。ioctl 并不好玩。
什么是 ioctl?
ioctl 函数是 POSIX 系统中的杂货系统调用。不想添加新的系统调用?让它成为 ioctl!ioctl 指的是系统调用以及可以与其一起发送的命令。ioctl 代表 "IO 控制",命令始终发送到文件描述符。
这个库支持什么?
这个库提供了 ioctl!
宏,用于绑定 ioctl
。它还尝试使用此宏将系统支持的每个 ioctl
绑定,但许多 ioctl
需要一些手动工作来支持(通常是通过提供 struct
或其他类型),而这个库目前尚不支持。
此外,在 etc
中,有脚本用于抓取系统头文件中的 ioctl
定义,并生成与它们对应的 ioctl!
调用。
如何获取魔法数字?
查看您系统的头文件。例如,/usr/include/linux/input.h
有很多行定义了使用 _IOR
、_IOW
、_IOC
和 _IORW
的宏。这些宏对应于在此包中定义的 ior!
、iow!
、ioc!
和 iorw!
宏。此外,还有一个 ioctl!
宏,用于创建一个类型更安全的 ioctl
包装器。
大多数 ioctl
几乎没有或很少文档。您需要查阅源代码以了解它们的功能和使用方法。
如何确定 ioctl 的调用约定?
对于 Linux,您必须查看内核中的 ioctl 处理程序,以确定传递的值是如何使用的。查找 copy_from_user()
和 get_user()
调用,这些调用将内存从用户空间复制过来,可能表明 ioctl 的参数是一个指针。在其他情况下,ioctl 参数可能简单地被转换为一个整数。
示例
use ioctl_sys::ioctl;
ioctl!(bad kiocsound with 0x4B2F);
ioctl!(none drm_ioctl_set_master with b'd', 0x1e);
ioctl!(read ev_get_version with b'E', 0x01; u32);
ioctl!(write ev_set_repeat with b'E', 0x03; [u32; 2]);
fn main() {
let mut x = 0;
let ret = unsafe { ev_get_version(0, &mut x) };
println!("returned {}, x = {}", ret, x);
}
许可证
许可方式任选其一
- Apache 许可证 2.0 版本,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选。
贡献
除非您明确表示,否则根据 Apache-2.0 许可证定义,您提交的任何贡献,旨在包含在作品中,应按上述方式双重许可,不得添加任何附加条款或条件。