gpt4 book ai didi

c - ioctl 调用总是返回 -1,但仍然有效

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:05 26 4
gpt4 key购买 nike

我正在尝试编写一个简单的设备驱动程序,用于使用 ioctl 在用户应用程序和驱动程序之间发送和接收结构。这是我解锁的 ioctl 函数 -

long ioctl_func(struct file *filep,unsigned int cmd,unsigned long arg)
{
int ret = 0;

struct ioctl_struct *my_struct = kmalloc(sizeof(struct ioctl_struct),GFP_KERNEL);
struct ioctl_struct *my_struct1 = kmalloc(sizeof(struct ioctl_struct),GFP_KERNEL);
switch(cmd)
{
case CMD_WRITE_STRUCT:
printk("Inside CMD_WRITE_STRUCT\n");
ret = copy_from_user(my_struct,(struct ioctl_struct *)arg,sizeof(struct ioctl_struct));
if(ret > 0)
{
printk("Error copy_from_user\n");
return -1;
}
printk("Structure received from user app:\nid = %d\nname = %s\ndata = %ld\n",my_struct->id,my_struct->name,my_struct->data);
return 0;
case CMD_READ_STRUCT:
printk("Inside CMD_READ_STRUCT\n");
my_struct1->id = 99;
strcpy(my_struct1->name,"Hello User!");
my_struct1->data = 65535;
ret = copy_to_user((char *)arg,my_struct1,sizeof(struct ioctl_struct));
if(ret)
{
printk("Error copy_to_user\n");
} return -1;

printk("Sent structure to user\n");
return 0;


default: printk("Invalid ioctl cmd\n");
break;
}
return 0;

}

我能够使用连续的 CMD_WRITE_STRUCT 命令成功地将结构从用户应用程序传递到驱动程序。然而,一旦我执行 CMD_READ_STRUCT,用户应用程序上的 ioctl 调用返回 -1,错误“不允许操作”,但结构已成功复制给用户。在 CMD_READ 之后,CMD_WRITE 不再工作,因为 ioctl 显示错误“无效的文件描述符”。我究竟做错了什么?

最佳答案

似乎您的代码在这里有一个简单的问题,它解释了这一点:“但是,一旦我执行 CMD_READ_STRUCT,用户应用程序上的 ioctl 调用返回 -1,错误为“不允许操作”,但结构已成功复制给用户.”

if(ret)
{
printk("Error copy_to_user\n");
} return -1;

应该是这样的

if(ret)
{
printk("Error copy_to_user\n");
return -1;
}

对于另一个问题,我认为您可能在您的应用程序中进行了一些错误检查,这会在返回 -1 的情况下关闭文件。只是一个疯狂的猜测。

关于c - ioctl 调用总是返回 -1,但仍然有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53578383/

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