9 个不稳定版本
使用旧的 Rust 2015
| 0.8.0 | 2022年2月28日 |
|---|---|
| 0.7.1 | 2021年3月17日 |
| 0.6.0 | 2020年11月17日 |
| 0.5.2 | 2017年3月17日 |
| 0.4.1 | 2016年8月17日 |
102 in Unix APIs
38,490 每月下载量
用于 63 个 crate (20 个直接使用)
14KB
361 行代码(不包括注释)
ioctl-sys & ioctls
用于在 Rust 中绑定 ioctl 的辅助工具。目前支持除 SPARC 和 Alpha 之外的所有架构上的 Linux。其他平台欢迎加入!
ioctl-sys crate 提供了一个基本接口来编写您自己的 ioctl 包装器。
ioctls crate 提供了一组 ioctls 的包装器。
这个库非常底层且复杂。使用 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的宏定义的行。这些宏对应于在此crate中定义的ior!、iow!、ioc!和iorw!宏。此外,还有一个用于创建对ioctl的包装并使其类型更安全的ioctl!宏。
大多数ioctl没有或很少有文档。您需要通过源代码来了解它们的功能和使用方法。
如何确定ioctl的调用约定?
对于Linux,您必须查看内核中的ioctl处理程序以确定传递的值是如何被使用的。寻找copy_from_user()和get_user()调用,这些调用将内存从用户空间复制过来,可能表明ioctl的arg是一个指针。在其他情况下,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 License,版本2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可(LICENSE-MIT 或 https://open-source.org.cn/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则您有意提交以包含在作品中并由您定义的任何贡献,根据Apache-2.0许可,应如上双许可,不附加任何额外条款或条件。