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 设备一样的设备结构和方法, 而且最少的代码复制.

相关文章
相关标签/搜索