- 论坛徽章:
- 0
|
本帖最后由 Gen216ius 于 2012-12-14 08:40 编辑
大家好,有个问题请教你!!先谢谢大家了!!
关于filp_open函数在kernel内核中执行,代码如下。
执行后,打印LOG都正常, 但是在根目录下的test.txt文件中没有程序所写的数据。不管所要写入的文件是否存在,结果都一样,就是没有看到相应的文件或所写内容没有写到相应的文件中,但读出来的数据与进去的数据是一样的。是什么原因会导致这样的结果啊!?谢谢!!
#define __KERNEL_SYSCALLS__
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <linux/mm.h>
#include <linux/slab.h>
#define KERNEL_LOCALFLAG 1
#include <mydebug.h>
void fileread(const char * filename)
{
struct file *filp; // 文件结构体代表一个打开的文件
struct inode *inode; //内核中用inode结构表示具体的文件,而用file结构表示打开的文件描述符
mm_segment_t fs;
/*其中:
typedef struct {
unsigned long seg;
} mm_segment_t;
*/
off_t fsize;
char *buf;
unsigned long magic;
KERNEL_DEBUG("start....\n");
filp=filp_open(filename, O_RDWR, 0); //文件结构
KERNEL_DEBUG("open return=%ld\n", IS_ERR(filp));
inode=filp->f_dentry->d_inode; //和具体文件联系一起
magic=inode->i_sb->s_magic; //
KERNEL_DEBUG("file system magic:%li \n",magic);
KERNEL_DEBUG("super blocksize:%li \n",inode->i_sb->s_blocksize);
KERNEL_DEBUG("inode %li \n",inode->i_ino);
fsize=inode->i_size;
KERNEL_DEBUG("file size:%i \n",(int)fsize);
buf=(char *) kmalloc(fsize+1,GFP_ATOMIC); //
fs=get_fs();
set_fs(KERNEL_DS);
filp->f_op->read(filp,buf,fsize,&(filp->f_pos));
set_fs(fs);
buf[fsize]='\0';
KERNEL_DEBUG("The File Content is:\n");
KERNEL_DEBUG("%s",buf);
filp_close(filp,NULL);
}
void filewrite(char* filename, char* data)
{
struct file *filp;
mm_segment_t fs;
filp = filp_open(filename, O_RDWR | O_CREAT, 0644);
if(IS_ERR(filp))
{
KERNEL_DEBUG("open error...%ld\n", IS_ERR(filp));
return;
}
KERNEL_DEBUG("open return=%ld\n", IS_ERR(filp));
fs=get_fs();
set_fs(KERNEL_DS);
filp->f_op->write(filp, data, strlen(data),&filp->f_pos);
set_fs(fs);
filp_close(filp,NULL);
}
int __init hello_init(void)
{
char *filename="test.txt";
KERNEL_DEBUG("write data to File.\n");
filewrite(filename, "kernel write test\n");//写数据
KERNEL_DEBUG("Read File from Kernel.\n");
fileread(filename); //读数据
return 0;
}
void __exit hello_exit(void)
{
KERNEL_DEBUG("Good,Bye!\n");
}
module_init(hello_init);
module_exit(hello_exit);
|
|