首先cat命令read裝置內容,當返回值是大於0的時候,cat會繼續在open裝置,然後進行read操作(每次讀4096位元組)。程式例子中第一次讀4096個位元組後,返回值4096,指標偏移也增加了4096,程式碼如下:
*ppos += count;----》值為4096
ret = count;
返回之後,cat又再一次open裝置,然後讀裝置,這是後read的引數發生變化了,具體註解如下:
static ssize_t globalmem_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
{
unsigned long p = *ppos;//這裡的*ppos=4096,第一次是0
unsigned int count = size;//這裡的size=4096。
int ret = 0;
struct globalmem_dev *dev = filp->private_data;
if(p >= GLOBALMEM_SIZE) //條件滿足,返回-ENXIO,
return count ? -ENXIO:0;
首先cat命令read裝置內容,當返回值是大於0的時候,cat會繼續在open裝置,然後進行read操作(每次讀4096位元組)。程式例子中第一次讀4096個位元組後,返回值4096,指標偏移也增加了4096,程式碼如下:
*ppos += count;----》值為4096
ret = count;
返回之後,cat又再一次open裝置,然後讀裝置,這是後read的引數發生變化了,具體註解如下:
static ssize_t globalmem_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
{
unsigned long p = *ppos;//這裡的*ppos=4096,第一次是0
unsigned int count = size;//這裡的size=4096。
int ret = 0;
struct globalmem_dev *dev = filp->private_data;
if(p >= GLOBALMEM_SIZE) //條件滿足,返回-ENXIO,
return count ? -ENXIO:0;