linux驅動中實現上層select介面

yingxian_Fei發表於2016-04-20

在驅動中實現file_operations結構的poll方法後,上層應用可以通過select或者poll方法來查詢裝置是否有資料可以讀寫。本文記錄驅動中實現上層select查詢裝置是否有資料可以讀取的方法。

1、實現file_operation

實現file_operation結構體中的相關開啟、關閉、查詢和讀取方法,在上層呼叫select介面時會呼叫poll方法,該方法完成如下動作:

① 在一個或多個可指示查詢狀態變化的等待佇列上呼叫 poll_wait. 如果沒有檔案描述符可用來執行 I/O, 則核心使程式在傳遞到該系統呼叫的所有檔案描述符對應的等待佇列上等待。
 返回一個用來描述操作是否可以立即無阻塞執行的位掩碼。

如:

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

static ssize_t landsem_is_shakeup_read(struct file *filp, char __user *buffer, size_t size, loff_t *off)
{
    size_t rel_size = 0;
    
    ls_dev_dbg("call %s.\n",__func__);   
    return rel_size;    
}

static unsigned int landsem_is_shakeup_poll(struct file *filp, struct poll_table_struct *wait)
{
    unsigned int mask = 0;

    poll_wait(filp, &event_wait, wait);
    //set mask
    if(/*資料可讀條件*/)  {
        mask |= POLLIN | POLLRDNORM;
    }
    
    return mask;
}

int landsem_is_shakeup_close(struct inode *inode, struct file *filp)  {

    return 0;
}

static struct file_operations fops_is_shakeup = {
	.open = landsem_is_shakeup_open,
	.read = landsem_is_shakeup_read,
	.poll = landsem_is_shakeup_poll,
	.release = landsem_is_shakeup_close,
};

2、在有資料可以供讀取時喚醒等待佇列

在有資料可以讀時如中斷底部處理程式碼中更新poll的判別條件並喚醒等待佇列,喚醒時用如下方法:

wake_up_interruptible(&(event_wait));		



相關文章