gpt4 book ai didi

在Linux中创建char设备并打开错误

转载 作者:行者123 更新时间:2023-11-30 17:35:52 25 4
gpt4 key购买 nike

我有硬件分配来创建一个简单的字符设备。我们正在使用 RedHad Linux。

使用此脚本加载字符设备后:

 #!/bin/sh
module="my_module"
device="my_device"
mode="a+w"

# remove stale nodes
rm -f /dev/$device

# invoke insmod with all arguments we got
# and use a pathname, as newer modutils don't look in . by default
/sbin/insmod -f ./$module.o $* || exit 1

major=$(cat /proc/devices | awk "\$2==\"$device\" || \$2==\"$module\" {print \$1}")

mknod /dev/$device c $major 0 || exit 2

# give appropriate group/permissions
chmod $mode /dev/$device

我正在尝试运行适用于该设备的脚本,但在 OPEN 命令上收到错误:

OSError: [Errno 1] Opration not permitted: '/dev/my_device'

我已经在网上到处搜索了,但找不到该错误的原因。

这可能是来自设备内部我的 open 函数的东西吗?:

int my_open(struct inode *inode, struct file *filp)
{
int res = -1;
if (filp->f_mode & FMODE_READ)
{
//
// handle read opening
//
if(my_major < 0)//in case we need to init the module
{
res = init_module();
}
if(res != 0)//initiation went wrong
return res;
numberOfReadUsers++;
return my_major;
}

if (filp->f_mode & FMODE_WRITE)
{
//
// handle write opening
//
if(my_major < 0)//in case we need to init the module
{
res = init_module();
}
if(res != 0)//initiation went wrong
return res;
numberOfWriteUsers++;
return my_major;
}

return 0;
}

int init_module(void)
{
my_major = register_chrdev(0, MY_DEVICE, &my_fops);

if (my_major < 0)
{
printk(KERN_WARNING "can't get dynamic major\n");
return my_major;
}
return 0;
}

我的文件中也有这个结构:

struct file_operations my_fops = {
.open = my_open,
.release = my_release,
.read = my_read,
.write = my_write,
.ioctl = my_ioctl
};

我正在以 super 用户身份工作任何帮助都会很好:)

最佳答案

好的,找到问题了。open 函数必须返回 0...在我的 open 函数中,我有一个可能返回 1 或 -1 的情况。将其更改为在任何时候都返回 0 后,它就可以工作了。在网上搜索后我发现这个函数可以返回0或Linux内核中定义的特定错误。

关于在Linux中创建char设备并打开错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22864638/

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