(莱昂氏unix源代码分析导读-46)权限、管道
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)权限、管道相关推荐
- (莱昂氏unix源代码分析导读-1) 引子
那一年不知怎样,此书忽在世间出现,天下学武 ...
- (莱昂氏unix源代码分析导读-19)再谈进程swtch
我们已经涉及到了部分进程切换的概念,在本章中,我们会从更一般的意义上考察进程切换的行为. 首先,进程切换(也称作context switch)一定是在内核中完成的. 比如,以下为发生进程切换的最常见的 ...
- (莱昂氏unix源代码分析导读-47) exec
by cszhao1980 现在,我们已经储备了足够的知识,该吹响向EXEC sys call冲锋的号角了. exec是系统中最重要也是最复杂的系统调用之一,它的作用是执行指定的"可执行文件 ...
- 读《莱昂氏UNIX源代码分析》
在unix早期的代码中,schedule和swap两个核心任务都是由0号进程来负责的,这个朴实的设计就是unix系统最最原始的设计,因为unix在开始设计的时候十分清楚进程应该做什么不应该做什么,应该 ...
- Hadoop源代码分析
http://wenku.baidu.com/link?url=R-QoZXhc918qoO0BX6eXI9_uPU75whF62vFFUBIR-7c5XAYUVxDRX5Rs6QZR9hrBnUdM ...
- Mysql源代码分析系列
Mysql源代码分析系列(2): 源代码结构 Mysql源代码主要包括客户端程序代码,服务器端代码,测试工具和一些库构成,下面我们对比较重要的目录做些介绍. BUILD 这个目录在本系列的上篇文章中我 ...
- Hadoop源代码分析(完整版)
Hadoop源代码分析(一) 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http:/ ...
- 《LINUX3.0内核源代码分析》第一章:内存寻址
https://blog.csdn.net/ekenlinbing/article/details/7613334 摘要:本章主要介绍了LINUX3.0内存寻址方面的内容,重点对follow_page ...
- KVM虚拟机源代码分析
1,KVM结构及工作原理 1.1 KVM结构 KVM基本结构有两部分组成.一个是KVM Driver ,已经成为Linux 内核的一个模块.负责虚拟机的创建,虚拟内存的分配,虚拟CPU寄存器的读写以 ...
最新文章
- 关于大型网站技术演进的思考(四)-存储的瓶颈4
- PaSS:用于 PacBio 测序的测序模拟器
- python爬虫案例讲解-Python爬虫案例集合
- TensorFlow2-生成对抗网络
- 用Setup Factory打包Visual C++ 2008开发的程序心得总结
- mstsc.exe的小插件,隐藏客户端计算机名
- 简述RAID 0,1,5,10区别
- 一个特别好用的免费json数据API接口--特别推荐
- igbt原理动画演示视频_igbt的结构原理与特性图解
- turtle库 科赫雪花(bug)的绘制
- 在sv testbench中加checker的几种办法
- 唱响艾泽拉斯_情感篇
- python打印文档添加条码_使用Python在Excel中批量生成条形码
- mysql 修改密码为 123456 教程
- 硅谷丛林的故事 EDA篇
- Office2016 打开excel出现丢失appvisvsubsystems32.dll
- 教女朋友学Python是道送命题
- 4. “随机漫步的傻瓜--纳西姆.尼古拉斯.塔勒布”读后感
- 解读CNAS更换徽标和认可标识
- 怎么看股票走势图(转贴)