by cszhao1980

 1.    文件与权限控制

进程u结构中,身份相关的信息有:

0420: char u_uid; /* effective user id */

0421: char u_gid; /* effective group id */

0422: char u_ruid; /* real user id */

0423: char u_rgid; /* real group id */

如果进程为超级用户,则u_uid 为0。函数suser()执行检查,如果为超级用户则返回1。

而inode结构中,记录了文件的所属关系:

5609: char i_uid;

5610: char i_gid;

如果进程的u_uid等于文件inode的i_uid,则表示该进程拥有此文件——超级用户是例外,

超级用户拥有任何文件。函数owner()执行此项检查,如果拥有此文件,则返回文件inode,

否则,返回NULL。

熟悉unix的同学应该都知道,unix文件的权限控制是在两个维度上进行的:

(1)         文件权限有三种:Read、write和Exec

(2)         不同用户所允许的权限不同,具体来说:

1)   文件owner(包括超级用户);

2)   同group;

3)   其他。

文件的权限信息记录在(indoe的)i_mode变量的低9bit中,每3 bit为1组,分为三组:

(1)         8~6:用于文件owner;

(2)         5~3:用于同group;

(3)         2~0:用于其他用户

在这3个 bit之中,最高bit为Read权限标志、中bit为write权限标志、低bit为Exec权限标志。

access()函数用于进行权限检查,莱昂有详细的介绍,在此不再赘述。

 2.    管道

管道是一种特殊的文件,用于unix的进程间通讯。

管道均为“小”文件,即小于4096个字节,如下所示:

#define PIPSIZ 4096

sys call pipe()用于生成管道,从代码可以看到,管道最大的特点是它拥有两个file数组项——分

别用于read和write,正因如此ip->i_count也被初始化为2。该函数需要注意的是其对R0、R1的

设置——如前面所述,falloc()会隐含的设置R0。

首先,看一下管道写函数writep(fp),其参数为file数组指针,指向该管道的“写”file entry:

(1)         plock锁定inode,因此,管道的读、写是互斥的,同一时间仅有一种操作可行;

(2)         检查管道的i_count,如<2证明Read已关闭,则管道的“写”功能也无意义,故error,并发信号;

(3)         管道最大为PIPSIZ个字节,在“写”时需要注意:

i.       ip->i_size1 == PIPSIZ,管道已写“满”,故睡眠;

ii.     7844 ~ 7847计算所能写的byte数,和剩余字节数;

(4)         7850 ~ 7853:唤醒因“读完”而等待的进程。

readp(fp)是管道读函数,与写函数的实现互相呼应,需要注意的是:

(1)         其参数为指向该管道的“写”file entry的指针:

(2)         7772行表示,已经读“完”了管道的内容——会清空管道;

除了这几个函数之外,还有一些函数对管道(FPIPE)有特殊的处理,如rdwr、closef等,

由于其实现比较简单,就请读者自行查看吧。

【思考题】:是解决EXEC sys call的时候了,相信您已经储备了足够的知识,这个任务就交给您了。

博客地址:http://blog.csdn.net/cszhao1980

博客专栏地址:http://blog.csdn.net/column/details/lions-unix.html

转载于:https://www.cnblogs.com/snake-hand/archive/2013/06/16/3138711.html

(莱昂氏unix源代码分析导读-46)权限、管道相关推荐

  1. (莱昂氏unix源代码分析导读-1) 引子

                                                                                   那一年不知怎样,此书忽在世间出现,天下学武 ...

  2. (莱昂氏unix源代码分析导读-19)再谈进程swtch

    我们已经涉及到了部分进程切换的概念,在本章中,我们会从更一般的意义上考察进程切换的行为. 首先,进程切换(也称作context switch)一定是在内核中完成的. 比如,以下为发生进程切换的最常见的 ...

  3. (莱昂氏unix源代码分析导读-47) exec

    by cszhao1980 现在,我们已经储备了足够的知识,该吹响向EXEC sys call冲锋的号角了. exec是系统中最重要也是最复杂的系统调用之一,它的作用是执行指定的"可执行文件 ...

  4. 读《莱昂氏UNIX源代码分析》

    在unix早期的代码中,schedule和swap两个核心任务都是由0号进程来负责的,这个朴实的设计就是unix系统最最原始的设计,因为unix在开始设计的时候十分清楚进程应该做什么不应该做什么,应该 ...

  5. Hadoop源代码分析

    http://wenku.baidu.com/link?url=R-QoZXhc918qoO0BX6eXI9_uPU75whF62vFFUBIR-7c5XAYUVxDRX5Rs6QZR9hrBnUdM ...

  6. Mysql源代码分析系列

    Mysql源代码分析系列(2): 源代码结构 Mysql源代码主要包括客户端程序代码,服务器端代码,测试工具和一些库构成,下面我们对比较重要的目录做些介绍. BUILD 这个目录在本系列的上篇文章中我 ...

  7. Hadoop源代码分析(完整版)

    Hadoop源代码分析(一) 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施.  GoogleCluster:http:/ ...

  8. 《LINUX3.0内核源代码分析》第一章:内存寻址

    https://blog.csdn.net/ekenlinbing/article/details/7613334 摘要:本章主要介绍了LINUX3.0内存寻址方面的内容,重点对follow_page ...

  9. KVM虚拟机源代码分析

    1,KVM结构及工作原理 1.1  KVM结构 KVM基本结构有两部分组成.一个是KVM Driver ,已经成为Linux 内核的一个模块.负责虚拟机的创建,虚拟内存的分配,虚拟CPU寄存器的读写以 ...

最新文章

  1. 关于大型网站技术演进的思考(四)-存储的瓶颈4
  2. PaSS:用于 PacBio 测序的测序模拟器
  3. python爬虫案例讲解-Python爬虫案例集合
  4. TensorFlow2-生成对抗网络
  5. 用Setup Factory打包Visual C++ 2008开发的程序心得总结
  6. mstsc.exe的小插件,隐藏客户端计算机名
  7. 简述RAID 0,1,5,10区别
  8. 一个特别好用的免费json数据API接口--特别推荐
  9. igbt原理动画演示视频_igbt的结构原理与特性图解
  10. turtle库 科赫雪花(bug)的绘制
  11. 在sv testbench中加checker的几种办法
  12. 唱响艾泽拉斯_情感篇
  13. python打印文档添加条码_使用Python在Excel中批量生成条形码
  14. mysql 修改密码为 123456 教程
  15. 硅谷丛林的故事 EDA篇
  16. Office2016 打开excel出现丢失appvisvsubsystems32.dll
  17. 教女朋友学Python是道送命题
  18. 4. “随机漫步的傻瓜--纳西姆.尼古拉斯.塔勒布”读后感
  19. 解读CNAS更换徽标和认可标识
  20. 怎么看股票走势图(转贴)

热门文章

  1. 你还在从零搭建 Java 项目 ?10000 字总结~
  2. 专业解决 MySQL 查询速度慢与性能差!
  3. 美团技术四面经历,作者已拿到Offer!
  4. Go包导入与Java的差别
  5. 一个简单案例,5 分钟看懂 Java Lamdba 表达式
  6. pycharm下找不到要安装的模块包(如sqlalchemy)
  7. Java经典面试题:一个线程两次调用start()方法会出现什么情况?
  8. spring boot实战(第六篇)加载application资源文件源码分析
  9. JVM:四种引用总结
  10. 多线程:interrupted、isinterrupted区别