当前位置:  技术问答>linux和unix

一个字符驱动的问题

    来源: 互联网  发布时间:2016-04-11

    本文导语:  我自己写了一个字符驱动~~~,就是按照LINUX 驱动开发第三版自己改写了的。 但是在用CAT输出字符的时候,却不停的输出停不下来。 请问是什么问题? 在线等~~~ #include  #include  #include  #include  #include  #incl...

我自己写了一个字符驱动~~~,就是按照LINUX 驱动开发第三版自己改写了的。
但是在用CAT输出字符的时候,却不停的输出停不下来。
请问是什么问题?
在线等~~~
#include 
#include 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define DATA_SIZE 1000

int pan_major=253;
  module_param(pan_major,int,S_IRUGO);
int pan_minor=0;
  module_param(pan_minor,int,S_IRUGO);

struct pan_dev{
  void *data;
  struct cdev cdev;
};
  struct pan_dev *pan_device;

MODULE_LICENSE("Dual BSD/GPL");

ssize_t pan_read(struct file *filp,char __user *buf,
 size_t count,loff_t *f_pos){
  struct pan_dev *dev = filp->private_data;
  ssize_t retval;

  // if(count > DATA_SIZE){count = DATA_SIZE;}
  //else{count = (long)*f_pos;}
  //count = (long)*f_pos;
  if(copy_to_user(buf,dev->data,count)){
retval = -EFAULT;
goto out;
  }
  *f_pos += count;
  retval = count;
 out:
  return retval;
}


int pan_write(struct file *filp,
  const char __user *buf,size_t count,
  loff_t *f_pos){
  struct pan_dev *dev = filp->private_data;
  size_t retval;

  //dev->data = kmalloc(DATA_SIZE*sizeof(char *),GFP_KERNEL);
  // if(count > DATA_SIZE){count = DATA_SIZE;}
  // else{count = (long)*f_pos;}
  //count = (long)*f_pos;

  memset(dev->data,0,DATA_SIZE*sizeof(char *));

  if(copy_from_user(dev->data,buf,count)){
retval = -EFAULT;
goto out;  
  }
  *f_pos += count;
  retval = count;
 out:
  return retval;
}

int pan_open(struct inode *inode,struct file *filp){
  struct pan_dev *dev;
  dev = container_of(inode->i_cdev,struct pan_dev,cdev);
  filp->private_data = dev;
  return 0;
}
int pan_release(struct inode *inode,struct file *filp){
  return 0;
}

struct file_operations pan_fops = {
  .owner = THIS_MODULE,
  .read = pan_read,
  .write = pan_write,
  .open = pan_open,
  .release = pan_release,
};

static void pan_exit(void){
  dev_t devno=MKDEV(pan_major,pan_minor);
  kfree(pan_device);
  unregister_chrdev_region(devno,1);
  printk(KERN_ALERT"Pan char modules exit!n");
}

static int pan_init(void){
  int result,err;
  dev_t dev = 0;

  if(pan_major){
dev = MKDEV(pan_major,pan_minor);
result = register_chrdev_region(dev,1,"pan");
  }else{
result = alloc_chrdev_region(&dev,pan_minor,1,"pan");
    pan_major = MAJOR(dev);
  }
  if(result data = kmalloc(DATA_SIZE*sizeof(char *),GFP_KERNEL);
  memset(pan_device->data,0,DATA_SIZE*sizeof(char *));
  //pan.data_size=DATA_SIZE;
  cdev_init(&pan_device->cdev,&pan_fops);
  err = cdev_add(&pan_device->cdev,dev,1);
  if(err){
printk(KERN_ALERT"Error %d add pan device ",err);
goto fail;
}
  return result;
 fail:
  pan_exit();
  return result;
}
module_init(pan_init);
module_exit(pan_exit);


|
你在read、write函数中都没有判断是否到达文件末尾,所以执行cat命令时永远有数据可以读,当然会不停打印。

    
 
 

您可能感兴趣的文章:

  • 字符设备驱动,混杂设备驱动,总线、设备、驱动模型、平台驱动
  • Linux设备驱动(第三版)- 字符设备驱动 - 例子
  • 如何处理客户机和服务器使用不同字符集(包括双字节字符)上传或下载文件时文件名的转换问题 iis7站长之家
  • 关于字符驱动的上限
  • 请教!关于linux字符驱动程序
  • 字符设备驱动程序问题
  • Linux 中多个字符设备的驱动问题。
  • 字符型设备驱动生成的块设备
  • 求助 简单测试字符驱动 Cannot allocate memory
  • 如何在内核模块中对linux字符驱动进行读写呢
  • 自己编写一个简单的字符设备驱动程序以后,改怎么使用它?
  • 关于字符设备驱动的一点疑问
  • sybase的JDBC驱动字符串是什么阿??
  • 关于字符设备驱动读写的问题,求助
  • 在编译字符驱动程序时,为何总是找不到头文件!急......
  • 字符驱动程序的疑问!
  • 关于字符驱动struct cdev的问题
  • linux 下简单的字符设备驱动
  • 请教:Solaris10下如何让字符设备驱动在开机自动启动呢?在线等...
  • Linux下写了一个字符设备驱动,找不到设备文件在哪个目录
  • 字符字符串加法问题?
  • 简单问题:如何检测一个字符串中是否存在一个字符?
  • Java中关于字符串字符数目的问题
  • 请教,有关16进制字符串形成2进制字符串的问题!
  • 急问bash shell中替换字符串中某字符为通配符的问题。
  • 有个小问题,如何将一字符串按一定规则分割成字符串数组?
  • C语言中的字符串拼接问题,怎么得不到我想要的字符串?
  • 问一个简单的shell问题:如何将一个文件中的字符串A全部用另外一个字符串B替换?
  • 如何处理客户机和服务器使用不同字符集(包括双字节字符)上传或下载文件时文件名的转换问题
  • 关于时间类型向字符串以及字符串向时间类型的转换问题? 很急
  • 在java中,如何将一个字符串如“技术性问题”转化成十六进制,反过来,如果有一个十六进制的字符串如“3F3F3A”,又如何将它还原成字符串
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Strings(字符串) 成员 size():返回字符串中字符的数量
  • 关于字符串的操作,我想得到字符串的长度,和他开始两位组成的新的字符串,例如::
  • C++ Strings(字符串) 成员 c_str():将字符串以C字符数组的形式返回
  • 请问怎样判断一个字符是中文字符还是英文字符?(空)
  • C++ Strings(字符串) 成员 find():在字符串中查找字符
  • C语言实现输入一个字符串后打印出该字符串中字符的所有排列
  • C++ Strings(字符串) 成员 end():返回一个迭代器,指向字符串的末尾。(最后一个字符的下一个位置)
  • 用Java正则去掉字符串中重复出现的字符
  • C++ I/O 成员 ignore():读取字符并忽略指定字符
  • 怎样去掉字符串中的tab字符?
  • C++ Strings(字符串) 成员 copy():将内容复制为一个字符数组
  • 如何使GDB显示完整的字符串变量,当字符串比较长时。
  • C++ Strings(字符串) 成员 rbegin():返回一个逆向迭代器,指向最后一个字符
  • 如何将一个双引号”放在一个字符串中,就是在字符串中如何转义一个双引号。谢谢!
  • C++ Strings(字符串) 成员 empty():如果字符串为空,返回真
  • php判断字符串在另一个字符串位置的方法
  • C++ Strings(字符串) 成员 begin():返回一个迭代器,指向第一个字符
  • crtl+alt+F1一直到F6都可以从图形到字符,那么,这和纯粹的字符界面有什么区别,也就是该/etc/initab的值为3后进入的字符界面?
  • C++ Strings(字符串) 成员 data():返回内容的字符数组形式
  • 请问如何判断字符串中的字符在a~z之间
  • C++ Strings(字符串) 成员 length():返回字符串的长度
  • jquery 删除字符串最后一个字符的方法解析


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3