如何在 Linux 内核模块中设置字符设备的模式?
How to set the mode for a character device in a Linux kernel module?
我正在创建一个玩井字游戏的角色设备模块。我正在尝试对其进行编程,以便将其 /dev/ticactoe
模式设置为 666
,而不是让用户使用 chmod
命令。
我的 main.c
包含以下 tictactoe
的 init
和 exit
的实现(为简洁起见进行了编辑):
static dev_t device_number;
static struct cdev our_cdev;
static struct class* my_class = NULL;
static struct file_operations fops = {
.owner = THIS_MODULE,
.read = tictactoe_read,
.write = tictactoe_write,
.open = tictactoe_open,
.release = tictactoe_release,
};
我有一个 tictactoe.h
包含以下内容:
#define MODULE_NAME "tictactoe"
int tictactoe_open(struct inode *pinode, struct file *pfile);
ssize_t tictactoe_read(struct file *pfile, char __user *buffer, size_t length, loff_t *offset);
ssize_t tictactoe_write(struct file *pfile, const char __user *buffer, size_t length, loff_t *offset);
int tictactoe_release(struct inode *pinode, struct file *pfile);
我读到了 umode_t
,但我不确定如何将其用于此模块。任何人都可以引导我朝着正确的方向前进或解释如何实现 umode_t
变量吗?感谢任何帮助。
/dev/{null,zero,...}
的内核源代码是您在有疑问时查找此类内容的好地方,看看在 drivers/char/mem.c
.[=24 中是如何实现的=]
为您的设备创建 class my_class
后,您应该将 ->devnode
字段设置为一个函数来设置您想要的模式。您可以在<linux/stat.h>
header中找到模式,设置为666
表示rw-rw-rw-
,即S_IRUGO|S_IWUGO
。最好在代码中的某处将其设置为常量。
解决方法如下:
#define DEV_CLASS_MODE ((umode_t)(S_IRUGO|S_IWUGO))
static char *my_class_devnode(struct device *dev, umode_t *mode)
{
if (mode != NULL)
*mode = DEV_CLASS_MODE;
return NULL;
}
然后在你的模块init
函数中:
my_class = class_create(THIS_MODULE, "tictactoe");
if (IS_ERR(my_class)) {
// Abort...
}
my_class->devnode = my_class_devnode;
哦,顺便说一句,你不需要#define MODULE_NAME
,它已经自动定义了,它是KBUILD_MODNAME
。
我正在创建一个玩井字游戏的角色设备模块。我正在尝试对其进行编程,以便将其 /dev/ticactoe
模式设置为 666
,而不是让用户使用 chmod
命令。
我的 main.c
包含以下 tictactoe
的 init
和 exit
的实现(为简洁起见进行了编辑):
static dev_t device_number;
static struct cdev our_cdev;
static struct class* my_class = NULL;
static struct file_operations fops = {
.owner = THIS_MODULE,
.read = tictactoe_read,
.write = tictactoe_write,
.open = tictactoe_open,
.release = tictactoe_release,
};
我有一个 tictactoe.h
包含以下内容:
#define MODULE_NAME "tictactoe"
int tictactoe_open(struct inode *pinode, struct file *pfile);
ssize_t tictactoe_read(struct file *pfile, char __user *buffer, size_t length, loff_t *offset);
ssize_t tictactoe_write(struct file *pfile, const char __user *buffer, size_t length, loff_t *offset);
int tictactoe_release(struct inode *pinode, struct file *pfile);
我读到了 umode_t
,但我不确定如何将其用于此模块。任何人都可以引导我朝着正确的方向前进或解释如何实现 umode_t
变量吗?感谢任何帮助。
/dev/{null,zero,...}
的内核源代码是您在有疑问时查找此类内容的好地方,看看在 drivers/char/mem.c
.[=24 中是如何实现的=]
为您的设备创建 class my_class
后,您应该将 ->devnode
字段设置为一个函数来设置您想要的模式。您可以在<linux/stat.h>
header中找到模式,设置为666
表示rw-rw-rw-
,即S_IRUGO|S_IWUGO
。最好在代码中的某处将其设置为常量。
解决方法如下:
#define DEV_CLASS_MODE ((umode_t)(S_IRUGO|S_IWUGO))
static char *my_class_devnode(struct device *dev, umode_t *mode)
{
if (mode != NULL)
*mode = DEV_CLASS_MODE;
return NULL;
}
然后在你的模块init
函数中:
my_class = class_create(THIS_MODULE, "tictactoe");
if (IS_ERR(my_class)) {
// Abort...
}
my_class->devnode = my_class_devnode;
哦,顺便说一句,你不需要#define MODULE_NAME
,它已经自动定义了,它是KBUILD_MODNAME
。