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 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则您有意提交以包含在作品中并由您定义的任何贡献,根据Apache-2.0许可,应如上双许可,不附加任何额外条款或条件。