- 論壇徽章:
- 0
|
本帖最后由 Gen216ius 于 2012-12-14 08:40 編輯
大家好,有個問題請教你!!先謝謝大家了!
關(guān)于filp_open函數(shù)在kernel內(nèi)核中執(zhí)行,代碼如下。
執(zhí)行后,打印LOG都正常, 但是在根目錄下的test.txt文件中沒有程序所寫的數(shù)據(jù)。不管所要寫入的文件是否存在,結(jié)果都一樣,就是沒有看到相應(yīng)的文件或所寫內(nèi)容沒有寫到相應(yīng)的文件中,但讀出來的數(shù)據(jù)與進(jìn)去的數(shù)據(jù)是一樣的。是什么原因會導(dǎo)致這樣的結(jié)果啊。恐x謝!
#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; // 文件結(jié)構(gòu)體代表一個打開的文件
struct inode *inode; //內(nèi)核中用inode結(jié)構(gòu)表示具體的文件,而用file結(jié)構(gòu)表示打開的文件描述符
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); //文件結(jié)構(gòu)
KERNEL_DEBUG("open return=%ld\n", IS_ERR(filp));
inode=filp->f_dentry->d_inode; //和具體文件聯(lián)系一起
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");//寫數(shù)據(jù)
KERNEL_DEBUG("Read File from Kernel.\n");
fileread(filename); //讀數(shù)據(jù)
return 0;
}
void __exit hello_exit(void)
{
KERNEL_DEBUG("Good,Bye!\n");
}
module_init(hello_init);
module_exit(hello_exit);
|
|