QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1537|回复: 1

内存虚拟字符设备驱动,但是其中的read,write有问题

[复制链接]
发表于 2005-7-19 18:24:24 | 显示全部楼层 |阅读模式
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/malloc.h>
#include <asm/uaccess.h>
#include <asm/page.h>
#include <linux/errno.h>
#include <linux/config.h>
char c_req[100];
static trace_major=0;
ssize_t trace_read(struct file *filp,char *buf,size_t count,loff_t *f_pos);
static ssize_t trace_write(struct file *filp,const char *buf,size_t count,loff
_t *ppos);
int trace_open(struct inode *inode,struct file *filp);
int trace_release(struct inode *inode,struct file *filp);
struct file_operations trace_ops={
        open:   trace_open,
        read:   trace_read,
        write:  trace_write,
        release:trace_release,
};
ssize_t trace_read(struct file *filp,char *buf,size_t count,loff_t *f_pos)
{
        int length=strlen(c_req);
        if(count>99) count=99;
        count=length-*f_pos;
        if(copy_to_user(buf,c_req,count))
        {
                printk("error reading,copy_to_user\n");
                return -EFAULT;
        }
        *f_pos+=count;
        return count;
}
static ssize_t trace_write(struct file *filp,const char *buf,size_t count,loff
_t *ppos)
{
        int num;
        num=count<100?count:100;
        if(copy_from_user(c_req,buf,num))
        return -EFAULT;
        printk("Trace_driver succed!\n");
        return num;
}
int trace_open(struct inode *inode,struct file *filp)
{
        filp->f_op=&trace_ops;
        printk("open success!\n");
        MOD_INC_USE_COUNT;
        return 0;
}
int trace_release(struct inode *inode,struct file *filp)
{
        MOD_DEC_USE_COUNT;
        return 0;
}
int init_module(void)
{
        int result;
        printk("initing......\n");
        result=register_chrdev(trace_major,"trace",&trace_ops);
        printk("Major is %d!\n",result);
        strcpy(c_req,"Hello,please write anything to trace!\n");
        printk("Success in getting buffer!\n");
        printk("%s\n",c_req);
        return 0;
}
void cleanup_module(void)
{
        unregister_chrdev(trace_major,"trace");
        printk("exiting......\n");
}
我用gcc -c trace.c -D_KERNEL_ -DMODULE -O2 -I/usr/src/linux-*.*.*/include -g -Wall -o trace.o编译也通过了,而且加载模块也成功了,然后用mknod /dev/trace 254 0注册文件系统成功。用cat也能正确显示:Hello,please write anything to trace!
但问题是我在用户空间用fread,fwrite以及其它一些文件读写函数调用为什么没反映?往里写的话更本不调用trace_write这个函数。但是我用cat file>/dev/trace确可以正常写入,用cat也能正常读取,这是为何?
发表于 2005-7-28 14:25:28 | 显示全部楼层
[code:1]但问题是我在用户空间用fread,fwrite以及其它一些文件读写函数调用为什么没反映?[/code:1]
这个是什么意思?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 12:47 , Processed in 0.044669 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表