linux單 open 設備

提供存取控制的強力方式是隻容許一個設備一次被一個進程打開(單次打開). 這個技術最 好是避免由於它限制了用戶的靈活性. 一個用戶可能想運行不一樣的進程在一個設備上, 一 個讀狀態信息而另外一個寫數據. 在某些狀況下, 用戶經過一個外殼腳本運行幾個簡單的程 序可作不少事情, 只要它們可併發存取設備. 換句話說, 實現一個單 open 行爲實際是在 建立策略, 這樣可能會介入你的用戶要作的範圍.node

 

只容許單個進程打開設備有不指望的特性, 可是它也是一個設備驅動最簡單實現的存取控 制, 所以它在這裏被展現. 這個源碼是從一個稱爲 scullsingle 的設備中提取的.併發

 

scullsingle 設備維護一個 atiomic_t 變量, 稱爲 scull_s_available; 這個變量被初 始化爲值 1, 表示設備確實可用. open 調用遞減並測試 scull_s_available 並拒絕存取 若是其餘人已經使設備打開.ide

 

static atomic_t scull_s_available = ATOMIC_INIT(1);測試

static int scull_s_open(struct inode *inode, struct file *filp)atom

{orm

 

struct scull_dev *dev = &scull_s_device; /* device information */ if (! atomic_dec_and_test (&scull_s_available))進程

{源碼

 

 

atomic_inc(&scull_s_available); return -EBUSY; /* already open */it

}io

 

/* then, everything else is copied from the bare scull device */ if ( (filp->f_flags & O_ACCMODE) == O_WRONLY)

 

scull_trim(dev); filp->private_data = dev; return 0; /* success */

}

 

release 調用, 另外一方面, 標識設備爲再也不忙:

 

static int scull_s_release(struct inode *inode, struct file *filp)

{

atomic_inc(&scull_s_available); /* release the device */ return 0;

}

 

正常地, 咱們建議你將 open 標誌 scul_s_available 放在設備結構中( scull_dev 這 裏), 由於, 從概念上, 它屬於這個設備. scull 驅動, 可是, 使用獨立的變量來保持這 個標誌, 所以它可以使用和空 scull 設備一樣的設備結構和方法, 而且最少的代碼複製.

相關文章
相關標籤/搜索