当前位置: 技术问答>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都不行,不知道该如何解决?
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;
}
#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,当然就退出了啊,两者的逻辑都不一样,结果当然不一样了!!!!!
好好回去读一下,你就明白了
你判断的逻辑是通过读出的内容,你的内容为0,当然就退出了啊,两者的逻辑都不一样,结果当然不一样了!!!!!
好好回去读一下,你就明白了
|
不是吧,我从来没考虑过结束符号.
出现死循环只可能是你自己的程序写错了,因为我也因为偏移量的问题出现过死循环.
出现的原因可能是cat的读取方式不一样.
出现死循环只可能是你自己的程序写错了,因为我也因为偏移量的问题出现过死循环.
出现的原因可能是cat的读取方式不一样.
|
缺少对读数组溢出的判断
|
my_read反回0就代表EOF