gpt4 book ai didi

c - ubuntu 使用可加载模块读取文件

转载 作者:行者123 更新时间:2023-11-30 16:53:05 24 4
gpt4 key购买 nike

嗨,我有一个类作业,要求我拦截一个打开的调用,然后读取文件并编辑输出,而不编辑文件本身,这一切都是在内核空间中的可加载模块中完成的。当我说编辑时,我的意思是像将单词 she 更改为 _he 用下划线替换 s 一样,它将单词 she 的每个实例更改为 _he ,这就是所需的结果。我在网上查了好几天试图弄清楚这一点,我认为我找到了一个合适的例子,但它一直给我一个错误。一旦我将模块输入内核,它立即说已被杀死,然后它说我无法删除它,因为它正在使用,而它不是这样,这迫使我重新启动我的虚拟机。下面是代码。任何帮助将不胜感激,谢谢。

 #include <linux/module.h>  // Needed by all modules
#include <linux/kernel.h> // Needed for KERN_INFO
#include <linux/fs.h> // Needed by filp
#include <asm/uaccess.h> // Needed by segment descriptors

int init_module(void)
{
// Create variables
struct file *f;
char buf[128];
mm_segment_t fs;
int i;
// Init the buffer with 0
for(i=0;i<128;i++)
buf[i] = 0;
// To see in /var/log/messages that the module is operating
printk(KERN_INFO "My module is loaded\n");
// I am using Fedora and for the test I have chosen following file
// Obviously it is much smaller than the 128 bytes, but hell with it =)
f = filp_open("/etc/fedora-release", O_RDONLY, 0);
if(f == NULL)
printk(KERN_ALERT "filp_open error!!.\n");
else{
// Get current segment descriptor
fs = get_fs();
// Set segment descriptor associated to kernel space
set_fs(get_ds());
// Read the file
f->f_op->read(f, buf, 128, &f->f_pos);
// Restore segment descriptor
set_fs(fs);
// See what we read from file
printk(KERN_INFO "buf:%s\n",buf);
}
filp_close(f,NULL);
return 0;
}

void cleanup_module(void)
{
printk(KERN_INFO "My module is unloaded\n");
}

module_init(init_module);
module_exit(cleanup_module);

最佳答案

关于从内核读取和写入文件,我建议您阅读以下文章并查看其中的代码片段:让我发疯——你永远不应该在内核中做的事情Linux 杂志 2005,Greg Kroah-Hartman

http://m.linuxjournal.com/article/8110

关于c - ubuntu 使用可加载模块读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41034970/

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