简体   繁体   English

无法在 kernel 模块中打开 filp_open 文件

[英]unable to open filp_open file in kernel module

I'm building a Linux module in C.我正在 C 中构建一个 Linux 模块。 I have two folders kernel_mode and user_mode .我有两个文件夹kernel_modeuser_mode

code in user_mode.c : user_mode.c中的代码:

fd=open("/dev/iot-device", O_RDWR);
printf("call open() fd= %d \n\n",fd);
error("fd");

code in kernel_mode.c : kernel_mode.c中的代码:

int iot_open(struct inode *inode, struct file *filp)
{
   file = filp_open("dev/ttyUSB0", O_RDWR, 0);
   printk(KERN_NOTICE "iot_open(): filp_open calls\n");
   if (IS_ERR(file) || file == NULL)
   {
       ret=PTR_ERR(file);
       printk(KERN_NOTICE "Cannot open destination file %s || ret=%d\n",path,ret);
       return ret;
   }
(...)
}
struct file_operations char_fops = 
{
    .owner =    THIS_MODULE,
    .open =     iot_open,(...)
}

kernel_mode.c I like this: kernel_mode.c我喜欢这个:

make (I have a makefile)制作(我有一个makefile)

insmod kernel_mode.ko insmod kernel_mode.ko

user_mode.c I run like this: user_mode.c我这样运行:

gcc user_mode.c -o user_mode gcc user_mode.c -o user_mode

./user_mode ./user_mode

terminal output:终端 output:

call open() fd= -1 

fd: Permission denied

dmesg : dmesg

iot_open(): open() open function was called
iot_open(): filp_open calls
Cannot open destination file dev/ttyUSB0  ||  ret=-2

Permissions and access rights权限和访问权限

crw-------   1 root root   (...) iot-device
crw-rw----   1 root dialout (...)  ttyUSB0

Used different flags in open() and filp_open() : O_RDONLY or O_RDWRopen()filp_open()中使用了不同的标志: O_RDONLYO_RDWR

What am I missing?我错过了什么? Please respond to my request!请回应我的要求! Any help is welcome欢迎任何帮助

Inattention is to blame for everything.疏忽是一切的罪魁祸首。

  1. file = filp_open("/dev/ttyUSB0", O_RDONLY, 0); (did not have /dev) (没有 /dev)
  2. permission must be crw-rw---- iot-device权限必须是crw-rw---- iot-device

you can do chmod every time.你可以每次都做chmod But I added code to kernel_mode.c :但我将代码添加到kernel_mode.c

static int my_uevent(struct device *dev, struct kobj_uevent_env *env)
{
    add_uevent_var(env, "DEVMODE=%#o", 0660);
    printk(KERN_NOTICE "my_dev_uevent(): Permission is rw-rw---- 0660\n");
    return 0;
}
int init_module(void)
{[...]
    my_class = class_create(THIS_MODULE, CLASS_NAME);[...]
    my_class->dev_uevent = my_uevent;//this is a new code!

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM