内核驱动中的read()、write()函数使用


read()、write() 函数

 

a -- read() 函数

 

   函数原型ssize_t (*read) (struct file * filp, char __user * buffer, size_t    size , loff_t * p);

   参数含义

 filp  :为进行读取信息的目标文件,

 

 buffer  :为对应放置信息的缓冲区(即用户空间内存地址);

 

 size :为要读取的信息长度;

 

 p :为读的位置相对于文件开头的偏移,在读取信息后,这个指针一般都会移动,移动的值为要读取信息的长度值

 

b -- write() 函数

 

 函数原型ssize_t (*write) (struct file * filp, const char __user *buffer, size_t count, loff_t *ppos);

 参数含义

filp :为目标文件结构体指针;

 

buffer :为要写入文件的信息缓冲区;

 

count :为要写入信息的长度;

 

Ppos :为当前的偏移位置,这个值通常是用来判断写文件是否越界

 

 两个函数的作用分别是 从设备中获取数据及发送数据给设备,应用程序中与之对应的也有 write() 函数及 read() 函数:

 

    len = read(fd,buf,len )

 

    len = write(fd,buf,size)

 

static ssize_t hello_read(struct file *filep, char __user *buf, size_t len, loff_t *pos)

 

static ssize_t hello_write(struct file *filep, const char __user *buf, size_t len, loff_t *pos)

 

       我们知道,应用程序工作在用户空间,而驱动工作在内核空间,二者不能直接通信的,那我们用何种方法进行通信呢?下面介绍一下内核中的memcpy---copy_from_user和copy_to_user,虽然说内核中不能使用C库提供的函数,但是内核也有一个memcpy的函数,用法跟C库中的一样。

copy_to_user(void __user * to,const void * from,unsigned long n);

相对于内核而言,把内核中的数据传给应用程序,from内核中数据to用户,长度为n,用在驱动中的read函数中。

 

copy_from_user(void * to,const void __user * from,unsigned long n);

相对于内核而言,把应用中的数据传给内核驱动,from用户中数据to内核,长度为n,用在驱动中的write函数中。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM