linux单 open 设备

提供存取控制的强力方式是只允许一个设备一次被一个进程打开(单次打开). 这个技术最 好是避免因为它限制了用户的灵活性. 一个用户可能想运行不同的进程在一个设备上, 一 个读状态信息而另一个写数据. 在某些情况下, 用户通过一个外壳脚本运行几个简单的程 序可做很多事情, 只要它们可并发存取设备. 换句话说, 实现一个单 open 行为实际是在 创建策略, 这样可能会介入你的用户要做的范围.

只允许单个进程打开设备有不期望的特性, 但是它也是一个设备驱动最简单实现的存取控 制, 因此它在这里被展示. 这个源码是从一个称为 scullsingle 的设备中提取的.

scullsingle 设备维护一个 atiomic_t 变量, 称为 scull_s_available; 这个变量被初 始化为值 1, 表示设备确实可用. open 调用递减并测试 scull_s_available 并拒绝存取 如果其他人已经使设备打开.

static atomic_t scull_s_available = ATOMIC_INIT(1);

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

{

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 */

}

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

原文地址:https://www.cnblogs.com/fanweisheng/p/11141902.html