免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4519 | 回复: 2
打印 上一主题 下一主题

file_open函数的使用问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-30 10:13 |只看该作者 |倒序浏览
本帖最后由 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);


论坛徽章:
0
2 [报告]
发表于 2012-11-30 10:42 |只看该作者
本帖最后由 Gen216ius 于 2012-11-30 12:55 编辑

大家帮忙看看,谢谢了!

论坛徽章:
0
3 [报告]
发表于 2012-12-14 08:41 |只看该作者
大家有遇到这样的情况吗!?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP