字元裝置驅動 mem_read()函式
阿新 • • 發佈:2019-02-18
字元裝置 mem_read()函式
/*讀函式*/ static ssize_t mem_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos) { int num = MINOR(filp->f_inode->i_rdev); ssize_t retval=0; //ssize_t:long,size_t:unsigned long ssize_t count=buf_size; count=(size>count)?(count):(size); //判斷讀位置是否有效 /* 最大空間4096,如果寫入100位元組,就只有100位元組有效 */ /* 此時要讀取4096位元組,最多返回100位元組,超過100位元組部分,返回0表示失敗,應用程式要讀4096,但實際只讀到100 */ //*ppos為當前讀寫的位置(當前訪問位置從0開始) /* 如果*ppos還沒到真實的大小時,繼續讀取,但是當*ppos超過了真實的大小時,則返回0, */ if(*ppos>=real_size) //*是否超出讀取範圍 return retval; if (num >= MEMDEV_NR_DEVS) return -ENODEV; printk(KERN_ALERT "Read chrdev.Major:%i Minor:%i\n",mem_major,num); //讀資料到使用者空間 if(copy_to_user(buf,buffer,count)) { retval=-EFAULT; goto err; } retval = count; *ppos+=count; //*將檔案當前位置向後移,已經讀取了的位元組 real_size=count; //*返回實際讀取位元組數 printk(KERN_ALERT "Read %li bytes to chrdev.\n",count); err: return retval; //*返回實際讀取位元組數 }