如何在Shell脚本中调用ioctl?

38
我正在尝试在仅有bash和原始基础工具的系统上执行ioctl调用。
是否有办法在shell脚本中执行针对/dev目录下特定设备文件的任意ioctl命令(如果参数仅为整数),而无需编写C / perl / python程序?例如"magic_ioctl /dev/console 30 1 2",它会调用"ioctl(open("/dev/console"), 30, 1, 2);"。

你可以查看你的驱动程序是否有sysfs接口。 - sehe
1
似乎你可以编写一个简单的C程序来完成这个任务。 - sorpigal
12
能够在嵌入式设备上的init脚本中发出ioctl调用(无需perl/python),而无需处理C程序的交叉编译/部署(只需在脚本中添加一行代码!)将非常方便。你在这方面有进展吗? - Anthony
2个回答

14

我专门为这个目的编写了ioctl工具: https://github.com/jerome-pouiller/ioctl

目前不支持向ioctl调用传递多个参数。你有一个需要使用多个参数的示例吗?

如果你想调用ioctl(open("/dev/console"), 30, 1);,可以运行:

ioctl /dev/console 30 -v 1

然而,对于大多数 ioctl,您需要分配一个缓冲区,并将指向该缓冲区的指针作为参数传递给 ioctl 调用。在这种情况下,只需忘记 -vioctl 将从标准输入/输出读取/写入缓冲区内容。 ioctl 会尝试从 ioctl 号猜测缓冲区大小和方向。

最好的方法是:ioctl 理解许多(约2200个) ioctl 符号名称。因此,您可以调用:

ioctl /dev/video0 VIDIOC_QUERYCAP > video_caps

2
在我的Android 2.3系统中发现了一个名字类似的股票实用程序,位于/system/bin/ioctl。 - ogurets
1
我认为这就是:https://android.googlesource.com/platform/system/core/+/android-4.4_r1/toolbox/ioctl.c - ogurets
如果您想在不打开文件的情况下对现有文件描述符运行ioctl,该怎么办? - Pavel Šimerda
@PavelŠimerda 不,它不被支持。然而,这个特性并不复杂。欢迎提交补丁。别忘了提供一个使用示例(在shell中操作文件描述符并不明显)。 - Jérôme Pouiller
1
@AlexD 确实,ioctl 需要一些关注。我下周会处理这个问题。 - Jérôme Pouiller
显示剩余2条评论

7
为什么你拒绝perl/c/python解决方案? 你可以使用perl一行代码来实现,像这样: perl -e require "sys/ioctl.ph"; ioctl(...);

8
有原因。例如,在我的目标平台上根本没有Perl/Python可用。而为此创建一个C程序有点麻烦。 - t7ko
我不想在系统更改时每次都重新编译C。 - Andy_A̷n̷d̷y̷

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接