gpt4 book ai didi

c - 试图将参数传递给 ioctl 调用将参数置零

转载 作者:太空狗 更新时间:2023-10-29 15:42:09 25 4
gpt4 key购买 nike

我正在尝试在玩具文件系统模块中调用一个 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

我敢打赌我做错了一些简单的事情。有人可以帮忙指出问题是什么吗?谢谢你。

最佳答案

这可能不是解决您问题的解决方案,但根据您的问题和评论中的有限信息,这是我可以收集到的。

根据问题和评论,您似乎以这种方式定义了一个 struct file_operations 结构:

struct file_operations fops = { .ioctl=ospfs_ioctl };

并且您的 ospfs_ioctl 的签名表明您使用的是较旧的 ioctl。

对于最近的内核(至少在 2.6.35+ 之后),建议使用 .unlocked_ioctl 而不是 .ioctl

struct file_operations fops = { .unlocked_ioctl=ospfs_ioctl };

ospfs_ioctl 函数的定义将更改为:

long ospfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)

可以找到unlocked_ioctl 和常规ioctl 之间的区别here .简而言之,它在调用 ioctl 之前不需要可怕的 BKL

另外,根据 Chris Dodd 的建议,您应该仔细检查如何定义您的 OSPFIOCRASH。推荐的方法是使用 _IO(magic, some_num_for_ioctl)

关于c - 试图将参数传递给 ioctl 调用将参数置零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15301971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com