单打开设备之外的下一步是使一个用户在多个进程中打开一个设备, 但是一次只允许一个 用户打开设备. 这个解决方案使得容易测试设备, 因为用户一次可从几个进程读写, 但是 假定这个用户负责维护在多次存取中的数据完整性. 这通过在 open 方法中添加检查来实 现; 这样的检查在通常的许可检查后进行, 并且只能使存取更加严格, 比由拥有者和组许 可位所指定的限制. 这是和 ttys 所用的存取策略是相同的, 但是它不依赖于外部的特权 程序.

这些存取策略实现地有些比单打开策略要奇怪. 在这个情况下, 需要 2 项: 一个打开计 数和设备拥有者 uid. 再一次, 给这个项的最好的地方是在设备结构中; 我们的例子使用 全局变量代替, 是因为之前为 scullsingle 所解释的的原因. 这个设备的名子是 sculluid.

open 调用在第一次打开时同意了存取但是记住了设备拥有者. 这意味着一个用户可打开 设备多次, 因此允许协调多个进程对设备并发操作. 同时, 没有其他用户可打开它, 这样 避免了外部干扰. 因为这个函数版本几乎和之前的一致, 这样相关的部分在这里被复制:

spin_lock(&scull_u_lock); if (scull_u_count &&

(scull_u_owner != current->uid) && /* allow user */ (scull_u_owner != current->euid) && /* allow whoever did su */

!capable(CAP_DAC_OVERRIDE))

{ /* still allow root */

spin_unlock(&scull_u_lock);

return -EBUSY; /* -EPERM would confuse the user */

}

if (scull_u_count == 0)

scull_u_owner = current->uid; /* grab it */

scull_u_count++; spin_unlock(&scull_u_lock);

注意 sculluid 代码有 2 个变量 ( scull_u_owner 和 scull_u_count)来控制对设备的 存取, 并且这样可被多个进程并发地存取. 为使这些变量安全, 我们使用一个自旋锁控制 对它们的存取( scull_u_lock ). 没有这个锁, 2 个(或多个)进程可同时测试 scull_u_count , 并且都可能认为它们拥有设备的拥有权. 这里使用一个自旋锁, 是因为 这个锁被持有极短的时间, 并且驱动在持有这个锁时不做任何可睡眠的事情.

我们选择返回 -EBUSY 而不是 -EPERM, 即便这个代码在进行许可检测, 为了给一个被拒 绝存取的用户指出正确的方向. 对于"许可拒绝"的反应常常是检查 /dev 文件的模式和拥 有者, 而"设备忙"正确地建议用户应当寻找一个已经在使用设备的进程.

这个代码也检查来看是否正在试图打开的进程有能力来覆盖文件存取许可; 如果是这样, open 被允许即便打开进程不是设备的拥有者. CAP_DAC_OVERRIDE 能力在这个情况中适合 这个任务.

release 方法看来如下:

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

{

spin_lock(&scull_u_lock); scull_u_count--; /* nothing else */ spin_unlock(&scull_u_lock);

return 0;

}

再次, 我们在修改计数之前必须获得锁, 来确保我们没有和另一个进程竞争.

转载于:https://www.cnblogs.com/fanweisheng/p/11141907.html

linux 一次对一个用户限制存取相关推荐

  1. linux下如何添加一个用户并且让用户获得root权限

    测试环境:CentOS 5.5 1.添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户 #passwd tommy   // ...

  2. Linux怎么完全删除一个用户

    这几天,服务器总有个程序在跑,霸占了30+G的显存,问了问,实验室的人没人认领,也跟相关老师确认过,这机器确实是只有我们实验室的人在用.这就有意思了,看来是有人乱入啊,而且最近有人说中了挖矿木马,难道 ...

  3. Linux:如何新建一个用户

    查看组:cat /etc/group 创建组:groupadd -g 500 sam(此处6666是自定义的一个组别编号,zwq是组名) 新建用户加入组:useradd –u 500 –g 500 – ...

  4. linux如何彻底删除一个用户

    userdel命令可以用于删除用户帐号及相关档案. 语法:userdel [-r] 用户名 参数:-r 用于彻底删除,用户HOME目录下的档案会被移除,在其他位置上的档案也将一一找出并删除,比如路径/ ...

  5. linux用户在哪个文件夹,LINUX中用命令成功建立一个用户后信息会记录在哪个文件中...

    LINUX中用命令成功建立一个用户后信息会记录在哪个文件中 发布时间:2007-07-28 10:14:57来源:红联作者:MPiops 增加用户帐号后 新建用户的命令十分简单,在命令行下使用 use ...

  6. linux系统如何用root用户登陆,Linux用root账号创建一个新的登录账号的方法

    Linux下如何创建新用户通常情况下,处于安全考虑,一般都给自己创建一个普通用户,而不直接使用root用户,因为权限大了,误操作就容易带来无法弥补的损失.Linux系统中,只有root用户有创建其他用 ...

  7. Linux系统怎么吸引用户,Linux下如何增加一个系统用户

    Linux下如何增加一个系统用户 (2008-04-08 14:18:11) 标签: it 人邮的<Linux指令速查手册>相当不错,我跟我的朋友都有一本.拿着也方便.我这人,看到好书都这 ...

  8. 【Linux服务器开发系列】手写一个用户态网络协议栈,瞬间提升你网络功底丨netmap/dpdk的实现

    手写一个用户态网络协议栈,瞬间提升你网络功底 1. 网卡基础架构 2. netmap/dpdk的实现 3. 网络协议栈实战 [Linux服务器开发系列]手写一个用户态网络协议栈,瞬间提升你网络功底丨n ...

  9. linux怎么授权目录,详解Linux如何将一个文件夹的所有内容授权给某一个用户?...

    详解Linux如何将一个文件夹的所有内容授权给某一个用户? 发布时间:2020-09-14 15:23:51 来源:脚本之家 阅读:138 作者:冰阔落 栏目:服务器 [问题分析] 我们可以使用cho ...

  10. linux 用户创建时间,在linux中如何能得知一个用户的创建时间?

    在linux中如何能得知一个用户的创建时间? (2011-08-24 03:36:01) 标签: 杂谈 在linux中如何能得知一个用户的创建时间?如题.之前我试过id.passwd以及通过stat查 ...

最新文章

  1. GPU上的基本线性代数
  2. 【实用主义】如何用nodejs自动定时发送邮件提醒?
  3. Xcode8 注释快捷键无效, 解决方案
  4. 对GC垃圾收集的一点整理
  5. 从零开始的AI·吃透kNN算法,学完我悟了(附实例代码)
  6. 性能测试之性能测试的基础理论
  7. Android7.0占用空间,Android7.0 开发者注意事项
  8. html5一年四季的变化,家乡四季的变化作文(精选5篇)
  9. Taro+react开发(1)--简介
  10. pythonchallenge--0
  11. Android CountDownTimer示例
  12. Unicode字符集和编码方式
  13. 合并时显示是无效的m3u8文件_如何合并m3u8及ts文件
  14. 2020 IJCAI 接受论文 list 分类排列(三)
  15. 大多数人不敢想的PDF操作:添加书签,电子签名,压缩,修改文字,提取部分页面为新文件、批量导出为图片
  16. 朋友间相处的七项法则
  17. 断点续传(视频进度条拖动以及flv.js需要断点续传)
  18. R语言3.6版本安装ggplot2报错解决方法
  19. Wi-Fi DFS与TPC介绍
  20. isin函数及其反函数

热门文章

  1. HTTP服务器状态代码定义
  2. 在线订餐系统php心得体会_基于php的网上订餐系统的设计与实现论文.doc
  3. 防火墙之iptables
  4. Mysql 用户管理
  5. FPGA浮点数定点数的处理
  6. BZOJ3456: 城市规划 多项式求逆
  7. Linux下Java安装与配置
  8. 移动端web自适应解决方案: adaptive.js
  9. 【原】linux下tar解压缩问题:time stamp in the future
  10. 虚拟机管理程序、虚拟化和云: 深入剖析 PowerVM 虚拟机管理程序