【发布时间】:2013-03-08 19:41:28
【问题描述】:
我试图在我的玩具文件系统模块中调用一个 ioctl 函数。我只是想让这个 ioctl 设置一个由调用者传入的变量。到目前为止,我已经建立了允许我进行 ioctl 调用的 ioctl 基础设施。我的模块中有这个函数来处理 ioctl。
int ospfs_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
if(cmd == OSPFSIOCRASH)
{
eprintk("crash: %ld\n", arg);
return 0;
}
else
return -ENOTTY;
}
我的测试函数是这样的。
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#define OSPFSIOCRASH 42
int main()
{
int fd = open("/tmp/cs111/lab3-thief/test/hello.txt", O_RDWR);
printf("ioctl call: %d\n", ioctl(fd, OSPFSIOCRASH, 100));
close(fd);
}
我希望输出是
crash: 100
ioctl call: 0
但输出实际上是
crash: 0
ioctl call: 0
我敢打赌我做错了一些简单的事情。有人可以帮忙并指出问题所在吗?非常感谢。
【问题讨论】:
-
您的目标平台是什么? x86?
-
如何设置
OSPFSIOCRASH?它需要对参数的方向和大小进行编码,可能使用_IOW(type, nr, unsigned long) -
这是一个运行 Debian 2.6.18-6-486 的 x86 模拟器 (QEMU)。如果这有什么不同的话。如何设置_IOW(type, nr, unsigned long)?
-
我想我一直在懒惰地实现 ioctl。我从另一个人的代码中复制了支持基础设施。总共有一个进入内核
.ioctl = ospfs_ioctl的钩子,在模块头OSPFSIOCRASH中定义了一个常量cmd 编号,并且有一个ioctl 处理函数(上图)。这就是其他项目拥有的所有 ioctl 代码。我只是注意到另一个项目在使用 ioctl 时没有传递任何参数......我不太确定我需要什么才能使它工作。 -
测试程序真的应该检查
open()的结果。我不知道我有多少不必要的头痛,因为文件系统没有正确重新安装。
标签: c linux-kernel kernel-module ioctl