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

如何在设备文件最后加上文件结束符?

    来源: 互联网  发布时间:2015-12-13

    本文导语:  我写了一个设备驱动程序,生成设备文件:/dev/demo,其对应的fops->read函数如下: static ssize_t demo_read(struct file* filp, char* buf, size_t count, loff_t* f_pos) { ssize_t retval = 0; char chrMessage[10] = "cpToUsr"; chrMessage[7] = 10...

我写了一个设备驱动程序,生成设备文件:/dev/demo,其对应的fops->read函数如下:
static ssize_t demo_read(struct file* filp, char* buf, size_t count, loff_t* f_pos)
{
ssize_t retval = 0;
char chrMessage[10] = "cpToUsr";
chrMessage[7] = 10;
chrMessage[8] = 0;
chrMessage[9] = -1; // file end : EOF

if(copy_to_user(buf, chrMessage, count))
{
retval = -EFAULT; // 书P68
goto out;
}
retval = count;
printk("this is fops->read : read from devicen");

out:
return retval;
}

用一个客户端应用程序以读文件的方式可以读出数组的内容,但是用cat命令却出现死循环。
我又自己手动建立了一个文件,在其中写入了相同的字符串,用原来的应用程序来读,显示相同的结果,用cat命令也能够正常显示。想来想去可能是设备文件缺少了文件结束的符号,加了-1, 10,0都不行,不知道该如何解决?

|
EOF==0,cat为什么出现死循环期待高手回答

|
用一个读指针跟踪.

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

MODULE_LICENSE("GPL");

#define BUFSIZE 1024

char s[BUFSIZE];

char *srptr, *swptr = s;

int writechar_major = 0;
int writechar_minor = 0;

struct cdev cdev;

struct rw_semaphore sem;

int my_open(struct inode *inode, struct file *filp)
{
  srptr = s;

  return 0;
}

int my_release(struct inode *inode, struct file *filp)
{
   return 0;
}

ssize_t my_read(struct file *filp, char __user *buf, size_t count, loff_t *fpos)
{
  int bytes_read = 0;
  ssize_t retval = 0;

  if(*srptr == 0){
    retval = 0;
    goto out;
  }
  while (count && *srptr) {
    put_user(*(srptr++),buf++);
    count--;
    bytes_read++;
  }
  retval = bytes_read;

 out:

  return retval;
}

|
很简单的道理啊,cat这个程序里面并不是一个字符一个字符读出来,而且人家判断的是返回值,而不是读取的数据是否为0
你判断的逻辑是通过读出的内容,你的内容为0,当然就退出了啊,两者的逻辑都不一样,结果当然不一样了!!!!!

好好回去读一下,你就明白了

|
不是吧,我从来没考虑过结束符号.
出现死循环只可能是你自己的程序写错了,因为我也因为偏移量的问题出现过死循环.
出现的原因可能是cat的读取方式不一样.

|
缺少对读数组溢出的判断

|
my_read反回0就代表EOF

    
 
 

您可能感兴趣的文章:

  • 问一个问题。请问如何在文件系统管理并使用设备,也就是当一个设备装载,下载时。文件系统是如何实现的
  • 设备与设备文件问题
  • 混杂 字符型设备 自动创建设备文件的问题
  • 请问cf接口设备一般对应什么设备文件呢?
  • 关于设备节点,设备文件系统的关系
  • 程序如何open这个设备,如何知道这个设备对应的特殊文件名?
  • Linux下写了一个字符设备驱动,找不到设备文件在哪个目录
  • 比较难的目录复制,如何原样复制链接符号文件和设备文件?
  • 设备文件
  • 用户可通过访问设备节点控制设备,是否也可直接读取class或devices里的文件获得设备信息?
  • 字符设备文件什么样子的文件名?
  • 键盘设备文件
  • 我如何找到这个设备的设备文件
  • 留步~~ 问个设备文件打开的问题
  • 应用程序中获取读取设备文件的权限
  • 没有ttyS4文件,怎样使系统有/dev/ttyS4设备文件?
  • 请教:如何知道在LINUX下设备所对应的文件?
  • 鼠标键盘对应的设备文件?
  • 在linux里键盘有对应的设备文件吗?
  • 一个设备文件能够无限制被打开么?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍
  • 弱问:一个设备能不能既是字符设备又是块设备?
  • 字符设备驱动,混杂设备驱动,总线、设备、驱动模型、平台驱动
  • 关于设备操作的一点迷惑:计算机如何知道驱动程序要操作的设备正好是指定的设备?
  • 如何根据主设备号打开设备?
  • 怎么知道设备节点对应那个设备?
  • MTD字符设备和块设备有着什么样的关系????
  • 字符型设备驱动生成的块设备
  • 怎么区分字符设备和块设备???????
  • linux2.4如何在设备拔出后将无效的设备节点也删除
  • 内存映射设备后,就可以直接访问设备的片内内存 了(比如显卡的显存)?
  • Linux的设备和设备号是指什么?可否简单的解释一下?
  • Linux设备驱动(第三版)- 字符设备驱动 - 例子
  • linux 启动的时候 可以检查出很多设备 并给设备配以驱动程序
  • 有人在Linux下用过1394接口的设备吗?怎么装载一个1394接口的存储设备呢?
  • linux无法认出USB设备,说设备不响应
  • 块设备与字符设备 怎么回事
  • 一个arm-linux有ppp0设备和eth0设备.怎么做这样的应用.
  • red hat7.3中有没有类似window中的设备管理器?我怎么样才能知道,我的某个设备是否正常工作,如网卡、声卡?
  • 在make xconfig中如何激活PCMCIA设备(记忆卡),PCMCIA设备(快闪记忆卡)?
  • fedora core2下,我删除了网卡设备,然后重新添加,为什么一添加就死机啊?在命令行模式下如何用命令添加网络设备啊?


  • 站内导航:


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

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

    浙ICP备11055608号-3