加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux单 open 设备

发布时间:2020-12-13 23:13:11 所属栏目:Linux 来源:网络整理
导读:提供存取控制的强力方式是只允许一个设备一次被一个进程打开(单次打开). 这个技术最 好是避免因为它限制了用户的灵活性. 一个用户可能想运行不同的进程在一个设备上,一 个读状态信息而另一个写数据. 在某些情况下,用户通过一个外壳脚本运行几个简单的程 序可

提供存取控制的强力方式是只允许一个设备一次被一个进程打开(单次打开). 这个技术最 好是避免因为它限制了用户的灵活性. 一个用户可能想运行不同的进程在一个设备上,一 个读状态信息而另一个写数据. 在某些情况下,用户通过一个外壳脚本运行几个简单的程 序可做很多事情,只要它们可并发存取设备. 换句话说,实现一个单 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 设备同样的设备结构和方法,并且最少的代码复制.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读