gpt4 book ai didi

c - 为什么 Linux 内核中的某些函数对字符串变量和字符串文字的作用不同?

转载 作者:太空宇宙 更新时间:2023-11-04 03:20:44 25 4
gpt4 key购买 nike

在 Ubuntu 16.04 内核版本 4.4 中,可加载内核模块具有以下行为:

(使用字符串文字)

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mount.h>
#include <linux/path.h>
#include <linux/namei.h>
#include <linux/fs.h>

static int __init myinit(void)
{
char *path_name = "~/microsoft.gpg";
struct path path;

printk("Module Init\n");

if (kern_path(path_name, LOOKUP_FOLLOW, &path) < 0)
{
printk("kern_path fail\n");
return 0;
}
printk("kern_path success\n");
return 0;
}


static void __exit myexit(void)
{
printk("Module Exit\n");
return;
}

module_init(myinit);
module_exit(myexit);

MODULE_LICENSE("GPL");

dmesg的结果是

Module Init

kern_path success

(使用字符串变量)

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mount.h>
#include <linux/path.h>
#include <linux/namei.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/segment.h>

#define MAX_PATH_LEN 256

static char path_name[MAX_PATH_LEN];

static struct proc_dir_entry *proc_file;

static int myopen(struct inode *inode, struct file *file)
{
printk("Module Open\n");
return 0;
}

static ssize_t mywrite(struct file *file, const char __user *user_buffer, size_t count, loff_t *ppos)
{
struct path path;
ssize_t bytes = count < (MAX_PATH_LEN - (*ppos)) ? count : (MAX_PATH_LEN - (*ppos));

if (copy_from_user(path_name, user_buffer, bytes))
return -EFAULT;

path_name[bytes] = '\0';

printk("Module Write\n");

if (kern_path(path_name, LOOKUP_FOLLOW, &path) < 0)
{
printk("kern_path fail\n");
(*ppos) += bytes;
return bytes;
}
printk("kern_path success\n");

(*ppos) += bytes;
return bytes;
}

static const struct file_operations fops =
{
.owner = THIS_MODULE,
.open = myopen,
.write = mywrite,
};

static int __init myinit(void)
{
printk("Module Init\n");
proc_file = proc_create("mymodule", 0644, NULL, &fops);
return 0;
}


static void __exit myexit(void)
{
printk("Module Exit\n");
remove_proc_entry("mymodule", NULL);
return;
}

module_init(myinit);
module_exit(myexit);

MODULE_LICENSE("GPL");

在shell中输入的命令是

echo ~/microsoft.gpg > /proc/mymodule

dmesg的结果是

Module Init

Module Open

Module Write

kern_path fail

我在写用户应用代码的时候并没有出现类似的问题,但是我真的很尴尬,因为内核模块有问题。

为什么第二个代码会出现问题?我该如何解决?


回答完毕

最佳答案

主要用于写入“内核文件”,echo命令在字符串末尾追加换行符(这在documentation中明确提到echo).

内核模块可以通过丢弃最后一个输入符号(如果是换行符)轻松处理这种情况:

if(path_name[bytes - 1] == '\n')
path_name[bytes - 1] = '\0';

关于c - 为什么 Linux 内核中的某些函数对字符串变量和字符串文字的作用不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46627153/

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