1、本章小节,4.1 文件和目的层次结构 4.2 文件和目录的命名 4.3 shell的文件名通配符 4.4 文件管理 4.5 目录管理 4.6 文件的归档与压缩处理 4.7 文件系统的存储结构,本章小节,4.8 硬连接与符号连接 4.9 系统调用 4.10 文件和目录的访问 4.11 获取文件的状态信息 4.12 设备文件 4.13 文件和目录的权限,4.1 文件和目的层次结构 4.2 文件和目录的命名,文件和目录的层次结构,文件和目录的布局 UNIX系统通过目录管理文件,文件系统组织成树状结构,目录中可以含有多个文件,也可以含有子目录。 路径名分割符用正斜线/,与系统有关的一些主要目录的取名和
2、在层次结构中的位置,几乎在所有UNIX系统中都相同 表4-1 UNIX常见的目录和文件,文件和目录命名规则,名字长度允许1255字符早期UNIX不支持长文件名,长度为1-14取名的合法字符除斜线外的所有字符都是命名的合法字符不可打印字符也可以做文件名(除了字节0)斜线留做路径名分割符大小写字母有区别,4.3 shell的文件名通配符,文件名通配符规则,UNIX的文件名通配符由shell程序解释,不同的shell,文件名通配符规则虽不同,但下表中的规则却一致。 表4-2常用的shell文件名通配符,shell文件名通配符的处理过程,文件名通配符的处理由shell完成,分以下三步 在shell提示
3、符下,从键盘输入命令,被shell接受 shell对所键入内容作若干加工处理,其中含有对文件通配符的展开工作(文件名生成),生成结果命令 执行前面生成的结果命令 【例4-1】 体验shell对文件名通配符的展开处理,验证文件名匹配的结果,在C语言中,从主函数main的两个参数,可以获得命令行参数的内容。 int main(int argc, char *argv) 参数argc:命令行参数的个数 参数argv:指向数组的指针,argv0指向命令自身,argv1argvargc-1指向shell解释过的命令参数。 【例4-2】从程序员的角度理解shell对通配符的处理,4.4 文件管理,文件名列
4、表:ls命令,基本功能 不给出任何名字时,列出当前目录下所有文件和子目录 名字为文件时,列出文件名 名字为目录时,列出目录下的所有文件和子目录 在同一命令行中可以指定多个名字 ls命令:简单实例 ls选项 ls有几十个选项,控制每个文件的列表格式,以及列表的范围包括哪些文件,允许同时指定多个选项,ls的选项,-a:列出所有(all)项。包括那些名字以句点打头的文件,默认情况下,名字以句点打头的文件不被列出 -R:递归地列出碰到的子目录 -F:标记(Flag)每个文件。目录后缀为 /;可执行文件后缀为 *;符号连接文件后缀为;管道文件后缀为 |;普通文件无任何标记 -i:列出文件的i节点号 -d
5、:若实参是目录,则只列其名字(不列内容) -l:长格式(long)列表,给出文件的属性信息,文件的属性信息(1),$ ls -l -rwxr-x-x l liang stud 519 Jul 5 15:02 arg 第1列第1字符:文件类型 - 普通文件 b 块设备文件(Block) d 目录文件(Dir) c 字符设备文件(Char) l 符号连接文件(Link) p 命名管道文件(Pipe),文件的属性信息(2),$ ls -l -rwxr-x-x l liang stud 519 Jul 5 15:02 arg 第1列第210字符:文件权限 2-4字符:文件所有者对文件的访问权限 5-7
6、字符:同组用户对文件的访问权限 8-10字符:其它用户对文件的访问权限 rwx分别代表读权限,写权限,可执行权限,-表示无此权限,文件的属性信息(3),$ ls -l -rwxr-x-x l liang stud 519 Jul 5 15:02 arg 第2列:文件link数,涉及到此文件的目录项数,后述。 第3列,第4列:文件属主的名字和属组名 第5列:普通磁盘文件:列出文件大小(字节数)目录:列出目录表大小,不是目录下文件长度和符号连接文件:列出符号连接文件自身的长度字符设备和块设备文件:列出主设备号和次设备号管道文件:列出管道内的数据长度,文件的属性信息(4),$ ls -l -rwxr
7、-x-x l liang stud 519 Jul 5 15:02 arg 第6列:文件最后一次被修改的日期和时间 第7列:文件名 对于符号连接文件,附带列出符号连接文件的内容,cp:拷贝文件,命令的两种格式和功能cp file1 file2cp file1 file2 . filen dir 其中file1,filen为文件名,dir为已有目录名例:cp a.c a.bak cp a.c b.c backup.dir 例: cp *.c bak.d 与DOS命令COPY *.C BAK.D执行结果相同,但过程不同UNIX中实际执行cp a1.c a2.c b1.c b2.c bak.d,mv
8、:移动文件,格式1mv file1 file2mv file1 file2 . filen dirmv dir1 dir2 功能使用mv命令可以将文件和目录改名可以将文件和子目录从一个目录移动到另一个目录,rm:删除文件,命令格式rm file1 file2 . filen 选项-r 递归地(Recursive)删除实参表中的目录,也就是删除一整棵目录树。-i 每删除一个文件前需要操作员确认(Inform)-f 强迫删除(Force)。只读文件也被删除并且无提示其它问题正在运行的可执行程序文件不能被删除,显式地区分命令选项和处理对象,问题 设当前目录下只有a,b,c三个文件 rm -i 只提供
9、选项,未指定任何文件,命令格式错 who -i 生成文件 -i (符合文件的命名规则) rm -i 不能删除文件 -i解决方法 许多UNIX命令(如cp,ls,mv,rm,cat,grep,set等)用-显式地标志命令行选项的结束,识别以 - 开头的处理对象。如: rm - -i (删除文件 -i ),find:在目录中查找文件,命令格式 find 查找范围 条件 动作 功能 find命令从指定的查找范围开始,递归地查找子目录,对满足条件的文件或目录,执行规定的动作选项 find命令的选项有许多条件选项和动作选项,因此命令功能很强,find命令的条件选项(1),-name 指定要匹配的文件名
10、可使用文件名通配符 *、?和,但要用引号括起来,以免被shell展开 -type 指定查找类型f:普通文件 d:目录 l:符号连接文件c:字符设备文件 b:块设备文件 p:管道文件 -inum 指定i节点号 -links 指定link数 -depth 指定路径深度,find命令的条件选项(2),-size nc 指定文件大小(单位是块或字节) 数字后面带字母c表示单位为字节,不带任何符号则为块 -mtime ndays 最近修改(写)时间(单位为天) -atime ndays 最近访问(读/执行)时间(单位为天) 注意 在选项7、8、9中,正号表示大于,负号表示小于,无符号表示等于。,find
11、命令的条件选项(3),-perm 指定文件的访问权限 -user/-nouser 指定文件主 -group/-nogroup 指定用户组 复合条件 可以用!、-o表示条件的非和或。多条件并列,默认为条件与。还可用()构成条件组合,find命令的动作选项,-print 显示查找的文件的路径名-exec 命令及参数 ; 对查找到的目标执行某一命令 在-exec及随后的分号之间的内容作为一条命令,代表所查到的路径名-ok 与-exec类似,只是对查找到符合条件的目标执行一个命令前需要经过确认 【例4-6】 几个使用find命令的例子,4.5 目录管理,路径名,绝对路径名与相对路径名 路径分量分隔符用
12、斜线/,而不是反斜线。绝对/相对路径名是以/不以斜线开头的路径名 当前工作目录 当前工作目录是进程属性的一部分,但没有当前逻辑盘的概念,相对路径名即以当前工作目录为参照的起点。,路径名,文件.与 在目录表中确实有两个文件,这两个目录项由系统创建和删除,分别代表本目录及其父目录 主目录(Home Directory) 每个用户都有自己独立的主目录,并保存在环境变量HOME中,显示和改变当前目录,pwd命令:显示当前工作目录 cd命令:改变当前工作目录 cd /usr/include cd / 斜线前必须有空格 cd cd 命令无实参 在DOS中,打印当前工作目录 在UNIX中,回到用户的主目录(
13、Home Directory),创建和删除目录,创建目录mkdir 例:mkdir sun/work.d mkdir除创建目录外,系统自动建立文件.与删除目录rmdir 例:rmdir sun/work.d 要求被删除的目录除.与外无其它文件或目录 其他命令:rm -r sun/work.d,cp:复制目录,cp命令选项 -r,递归地复制一个目录cp -r dir1 dir2 若dir2不存在,则新建子目录,并将dir1下内容拷入 若dir2已存在,则将所有文件拷入目录dir2 选项 -v,冗长(verbose)方式 复制时列出所拷贝的文件名 选项 -u,增量拷贝(update),便于备份目录
14、 根据文件的时戳,不拷贝相同的或者过时的版本的文件,以提高速度 dir1和 dir2 不慎颠倒位置,不会出现灾难性后果,cp:复制目录(举例),复制目录 将目录work.d复制为bak.d cp -r work.d bak.d 增量拷贝 将work.d中的内容增量拷贝到备份目录bak.d中 cp -ruv work.d bak.d 命令touch 将文件的最后一次修改时间设置为当前时间,但不修改文件内容。例如:touch *.ch,4.6 文件的归档与压缩处理,tar:文件归档,功能 tar命令最早为顺序访问的磁带机设备而设计的(Tape ARchive,磁带归档),用于保留和恢复磁带上的文件
15、命令格式及选项tar ctxuvf device file-list c:Create创建新磁带。从磁带的头上开始写,以前存于磁带上的数据会被覆盖掉 t:Table列表。磁带上的文件名列表,当不指定文件名时,将列出所有的文件,tar:文件归档,x:eXtract抽取。从磁带中抽取指定的文件。当不指定文件名时,抽取所有文件。如果磁带上有多个同名文件时,最后一个文件将覆盖所有较早同名文件 u:Update更新。把文件追加到磁带尾部,这个文件的某个版本可能已经存放到磁带上。为了兼顾磁带顺序访问特点,新版本文件追加到文件尾部,旧版本文件仍保留 v:Verbose冗长。tar每处理一个文件,就打印出文件
16、的文件名,并在该名前冠以功能字母 f:File指定设备文件名,文件压缩和解压缩,命令compress和uncompress采用LZW算法对文件压缩,是一种字典压缩算法压缩算法对文件中有规律的数据内容压缩效率很高普通文本文件可压掉50-80%有许多空白字段的数据库文件甚至可压掉90%以上压缩完的文件名后缀是.Z 【例4-8】使用tar命令的例子 【例4-9】使用tar命令和compress命令通过网络复制一个目录树,4.7 文件系统的存储结构,文件系统的存储结构,根文件系统与子文件系统 根文件系统(root filesystem)根文件系统是整个文件系统的基础,不能 “脱卸(umount)” 子
17、文件系统子文件系统,包括硬盘,软盘,CD-ROM,USB盘,网络文件系统NFS,都以根文件系统中某一子目录的身份出现,不象DOS那样使用逻辑盘的概念 独立的存储结构根文件系统和子文件系统都有其自己独立的文件系统存储结构,甚至文件系统的格式也可以不同,文件系统的创建和安装,三个实例 【例4-10】 文件系统的创建和安装 【例4-11】 网络文件系统NFS的安装 【例4-12】 Linux系统中引用Windows格式的磁盘分区的例子,文件系统的结构,逻辑块设备 Unix的每个逻辑块设备都对应一个块设备文件,例如硬盘的一个分区,一张磁盘,一张光盘或USB接口的Flash盘等 Unix格式的子文件系统
18、 以逻辑块(一个或多个物理磁盘扇区)为单位划分和管理逻辑设备的存取,块编号为0,1,2,.,文件系统的结构,Unix文件系统的结构引导块(0号块)用于启动系统,只有根文件系统的引导块有效 专用块 (1号块):也叫管理块,或者超级块存放与整个文件系统的管理有关的信息。如:文件系统的大小,i节点区的大小,空闲空间大小,空闲块链表的头等等,文件系统的结构,i节点区 i节点(index node,简记为i-node) i节点区由若干块构成,在文件系统创建时确定,总数固定 每磁盘块可容多个i节点,每个i节点为64字节 i节点编号:从1开始。1,2,3,. 每个文件都对应一个i节点 每个i节点中的数据 文
19、件存储区 用于存放文件数据的区域,包括目录表,文件系统的结构,每个 i 节点中的数据 指向文件存储区数据块的一些索引指针 文件属性:文件类型,属主,组,权限,link数,大小,时戳 i节点内不含文件名,目录存储结构,树形带交叉勾链的目录结构 目录表 每个目录表也作为一个文件,存于“文件存储区”中,有其自己的i节点 目录表由一个个“目录项”构成 每个目录项由“文件名-i节点号”对构成 用ls命令列出的目录大小是目录表本身的长度 一个文件可对应多个目录项 当两个以上目录项的i节点号相同时,它们实际上代表同一个文件,这就是一个文件的链接数 图4-5 文件系统目录表的构造,命令df与du,df:显示文
20、件系统的空闲空间(disk free space) 列出每个子文件系统的设备文件名,安装的路径,文件存储区和i节点区的总长度,空闲空间和百分比。 不同系统的df显示不完全相同,常用选项有-v和-i。-v选项使系统显示更多的信息,-i显示与i节点有关的信息。 du:显示磁盘使用信息 显示包括所有下属子目录在内的某一目录树中文件使用的块数总和,显示单位仍然是“块” 【例4-13】 使用df命令的例子 【例4-14】 使用du命令的例子,4.8 硬连接与符号连接,硬连接和符号连接,硬连接 目录表由目录项构成,目录项是一个“文件名 -i 节点号”对 根据文件系统的存储结构,完全可以在同一目录或者不同目
21、录中的两个目录项,有相同的 i 节点号 目录项指定的文件名 -i 节点号映射关系,叫做硬连接 硬连接数目(link数):同 -i 节点被目录项引用的次数 连接命令:ln 已有文件名 硬连接文件名 【例4-15】 普通数据文件的硬连接 【例4-16】 程序文件的硬连接,目录表的硬连接,用ln建立硬连接时,只限于文件,两个文件名的路径名也必须处于同一文件系统中。 不允许对目录用ln命令建立硬连接,从文件系统的存储结构上看,建立这种硬连接很容易实现,但这会破坏目录的树型结构,使得目录结构变成网状结构。 尽管不允许对目录建立硬连接,但创建目录时操作系统内核会自动在所创建的目录中创建.和文件,使得目录的
22、硬连接数目并不是1。一般来说,目录的link数=直属子目录数+2 图4-6 目录文件的硬连接,符号连接,符号连接的建立 用命令ln s 可建立符号连接文件,而命令ls -l 显示符号连接文件的详细信息。该文件中仅包括被连接文件或目录的路径名 符号连接的特点 文件的最后一次写时间以后不再变化 一旦建立了符号连接,删除操作删除的是符号连接文件,其它所有操作都将访问符号连接所引用的文件 创建符号连接时,被连接文件可以不存在 【例4-17】 符号连接的使用举例,内核模块处理符号连接的方法,系统处理路径名分量时发现符号连接,就把符号连接内容加到路径名的剩余部分的前面,产生结果路径名 若符号连接包含绝对路
23、径名,使用绝对路径名,否则,将根据在文件层次中该连接的相对位置来计算符号连接的内容,而不是根据调用进程的当前的工作目录 【例4-18】 符号连接的展开方式,硬连接与符号连接的比较,硬连接 在数据结构层次上实现,只适用于文件,不适用于目录。不同文件系统之间也不行 符号连接 在算法软件上实现,硬连接能够完成的功能都可以做到。适用于目录和不同的文件系统。但同硬连接相比,要占用内核一部分开销 为避免循环式符号连接,在进行递归路径名处理时内核利用最大计数防止死循环,符号连接举例,【例4-19】 符号连接与硬连接的区别 【例4-20】 观察UNIX命令对符号连接文件的操作 【例4-21】 符号连接与硬连接
24、的比较,符号连接与目录层次的关系 【例4-22】 使用硬连接和符号连接共享数据文件以节约存储空间 【例4-23】 使用符号连接对程序和用户透明地变更目录组织结构,4.9 系统调用,系统调用(System call),系统调用的基本概念 操作系统的内核提供的编程界面 应用程序和操作系统进行交互的唯一手段例如:文件操作的open,read,write,close等 与普通的库函数调用在执行方式上有区别 UNIX第7版50多个,SVR4扩充到120个 调用函数的名字,参数排列顺序,参数的类型定义,返回值的类型,以及实现的功能,都属于POSIX标准来规范的内容,以便于程序移植。,系统调用返回值,返回值
25、 UNIX的系统调用一般都返回一个整数值。返回值大于或等于零:成功;返回值为-1:失败整型变量errno 标准库为errno保留存储空间,系统调用失败后填写错误代码,记录了失败原因 #include 之后,就可以直接使用errno errno.h头文件定义了许多有E前缀的宏,例如 EACCESS,EIO,ENOMEM,EINTR。 相关系统调用的手册页中有出错说明,错误处理:strerror与perror,strerror char *strerror(int errno); errno便于程序识别错误原因,不便于操作员理解失败原因。库函数strerror将数字形式的错误代码,转换成一个可阅读
26、的字符串perror void perror(char *string); 在标准错误输出上产生一消息,描述errno的错误 格式:先打印字符串string,再打印出一个冒号和空格,然后再打印出这条消息和换行符,4.10 文件和目录的访问,文件存取,文件 逻辑上相关的一组数据 文件管理模块 提供了便捷的手段管理存储在外存中的数据;提供了便于记忆的“文件名”;负责管理外存的分配和释放 负责检索出文件中数据在磁盘中的存储位置 应用程序 根据文件名来访问存储在外存中的数据。 文件看起来是前后相继的连续的无格式字节流,应用程序可以按照自己的意愿去解释这个字节流。,文件描述符,文件描述符是快速访问文件信
27、息结构的索引,该索引是从0开始编号的整数。它是操作系统内核中进程PCB(process control block,进程控制块)结构里的一个数组的下标。 每个进程有自己独立的一套文件描述符 通过指定文件名,打开文件的系统调用可以在内核数据区中创建文件结构数据,并返回指向该文件的文件描述符。后续对该文件的操作只需引用代表该文件的文件描述符即可。,打开文件的系统调用,#include int open(char *filename, int flags); int open(char *filename, int flags, mode_t mode); 其中,字符串filename提供一个文件名
28、,flags在这里是个比特位图,可以使用中定义的宏名字用|操作符连接起来,表示文件打开的各种方式见表4-3 第三个参数mode仅在创建新文件时使用,它是一个整数,用数字方式给出文件的存储权限。 函数返回值是一个整数,是新打开文件的“文件描述符”,以后的read和write都使用这个文件描述符。如果open返回-1,那么,文件打开失败。,终端文件,为了使终端的I/O更方便,系统在启动一个程序时自动为程序准备好了三个文件描述符,分别是0、1、2,分别称作标准输入,标准输出,标准错误输出。 这三个文件默认地指向当前终端。程序不必要执行open就可以直接使用这三个文件描述符。0是只读方式打开的文件描述
29、符,对应当前终端的键盘输入;1和2是只写方式打开的文件描述符,对应终端的屏幕输出。 如果程序用open打开其他文件,就会有文件描述符3、4等。,读写文件,int write(int fd, void *buf, int len);fd是已经打开的文件的文件描述符,buf是写缓冲区指针,指向要写的数据,len是期望写的字节数。返回值是真正写入的字节数。一般情况下,如果该字节数小于len,则说明发生了错误。 int read(int fd, void *buf, int len); fd含义与write相同,buf是存放读来的数据的缓冲区指针,len是期望读的字节数。返回值是实际读的字节数。若返回
30、的字节数小于len,表示读到了文件尾。,当前读写位置指针,内核为每个打开的文件保留一个记录当前操作位置的指针。无论是read还是write,都从文件的当前位置读取或写入,操作之后,文件当前指针自动向后移动。 系统调用lseek提供了一种手段,用于强制设定文件的当前读写位置指针,下次的read或者write从这个位置开始。 移动当前读写位置指针的系统调用是: off_t lseek(int fd, off_t offset, int whence);,移动位置指针的系统调用:lseek,#include #include off_t lseek(int fd, off_t offset, int
31、 whence); fd是文件描述符,offset是一个字节偏移量,函数返回值是下次读写位置。off_t是整数类型,不同系统中可能整数的位宽度不同,可能是32位整数,或者64位整数。 off_t在头文件中定义。whence是指偏移量offset的参考基准,在中有几个相关的宏定义如下表4-5 所示,关闭文件,关闭文件的调用很简单,提供一个“文件描述符”作为参数。 int close(int fd); 不使用的文件,应当关闭。每个程序允许同时打开的文件数目是有限的,整个系统允许打开的文件总数,也是有限的。每个有效的文件描述符都对应内核的部分资源。 程序无论正常还是异常退出时,所有由程序打开但尚未关
32、闭的有效的文件描述符,系统都会自动关闭。,文件访问举例,截断文件的系统调用:ftruncate int ftruncate(int fd, off_t length); 文件截断后的剩余长度为length个字节。如果length为0,那么就将文件长度截短为0。 例4-24使用系统调用函数编程序以十六进制打印数据文件的内容 注:文件访问的另一种方式是使用C语言的标准函数fopen,fprintf,fscanf,fgets,fread,fwrite,fclose。这一组函数,是在系统调用open,read,write,close基础上构建的库函数。,目录访问,在文件系统中,目录中的数据就是“文件名
33、-i节点”对。可以像普通文件那样用open打开一个目录文件,每读16B,就是一个目录项。程序自己分析i节点号和文件名。 【例4-25】与普通数据文件相同的方式访问目录文件 在早期的UNIX中,每个目录项占16B,包括两字节的i节点号和最长14B的文件名。i节点号为0的条目,标志这一目录项已经失效,这是由于删除文件导致的。因此,i节点编号从1开始而不是从0开始编号。 使用了长文件名之后,目录的存储结构发生了变化,应用程序就必须了解目录文件的存储结构,这很不方便。因此,系统提供了几个库函数,用于操作目录表文件。,目录访问的库函数,DIR *opendir(char *dirname); struc
34、t dirent *readdir(DIR *dir); int closedir(DIR *dir); opendir打开一个目录,得到一个指向该目录的句柄(返回-1表示失败)。 readdir使用已经打开的目录句柄,每次调用获得一个目录项的数据。返回值是指向的dirent目录结构体的指针,i节点号和文件名分别放在该结构体的d_ino和d_name成员中。返回NULL表示已经读到目录表尾。 不再使用的目录句柄,用closedir关闭。 例4-26目录表的访问举例 表4-6 与目录表相关的操作函数,4.11 获取文件的状态信息 4.12 设备文件,获取文件的状态信息,利用系统调用stat或库函
35、数fstat,可以获取文件或者目录的状态信息,这些信息大部分来自于 i 节点中的管理信息。 int stat(char *path, struct stat *statbuf); int fstat(int fd,struct stat *statbuf); stat利用给出的路径名寻找指定文件的i节点;fstat利用已经打开的文件描述符fd从内核的活动 i 节点表中寻找文件的 i 节点。 i 节点提取的状态数据放入调用者提供的stat结构体 参数statbuf中。,设备文件,设备看起来同磁盘文件一样,可以通过文件系统里的文件名进行访问,是UNIX设备管理的一大特点。 UNIX的设备分为块设备
36、和字符设备。块设备是面向磁盘等可以随机访问的存储设备,统一定义一种可以随机地根据块号进行操作的驱动界面,提供给文件系统使用。 文件系统中的命令mkfs,mount等,使用块设备文件名,映射块设备。 除了块设备之外的所有设备,包括终端、打印机等,都算作字符设备,也叫做“原始(raw)”设备。,设备命名,所有设备在文件系统中都拥有一个文件名,这是特殊类型的文件,在文件的i节点中记录了文件类型是块设备文件或者字符设备文件。 每个设备都对应一个主设备号和次设备号,也记录在i节点中。 按照惯例,设备文件都放在/dev目录下。使用ls -l时,对于设备文件,列出主设备号和次设备号。,虚拟设备,如果一个设备
37、驱动程序不操作任何物理硬件,却像普通设备驱动程序一样提供设备驱动程序入口,并通过这些入口和内核交互作用,得到某些数据。这些设备叫做“虚拟设备”。 例如:设备文件/dev/mem和/dev/kmem可以通过某些操作获取内核中的一些数据表格内容,常常被随操作系统软件带来的一些运行在用户态的工具使用。,虚拟设备,在Linux系统中,虚拟设备文件/dev/random是一个随机数生成器,根据系统键盘和鼠标等外设的活动生成二进制的随机数数列。 虚拟设备文件是/dev/null,所有写入该设备的数据统统被丢弃;任何时候都可以打开该设备读取,但读不到任何数据,就遇到文件结束。 许多UNIX都提供虚拟设备文件
38、/dev/zero,向这个文件中写入数据,如同写入/dev/null,所有数据被丢弃。不同的是从文件/dev/zero中读取时,任何一次read系统调用都会返回一连串的0。 【例4-27】 设备文件/dev/null的使用举例,4.13 文件和目录的权限,文件和目录的权限,权限的作用 用于控制进程对系统中文件和目录的访问权限的三个级别 文件主,同组用户,其他用户 每个文件有唯一的属主普通文件的权限 读、写、可执行 不可写文件也可以被删除,两类可执行文件,程序文件二进制的CPU指令集合,满足规定的格式脚本文件:ASCII文件 默认的解释程序为/bin/sh 可以在文件的第一行自行指定解释程序,例
39、如:#! /bin/csh 解释程序也可以是用户自己编写的应用程序,目录的权限,读权限若无读权限,那么“目录表”文件不许读,ls会失败 写权限若无写权限,那么“目录表”文件不许写创建文件,删除文件,文件改名会修改目录文件修改文件不需要修改目录文件,需要修改 i 节点目录无写权限不是指目录下所有文件禁止写执行权限有执行权限意味着分析路径名过程中可检索该目录,权限验证的顺序,文件主与进程主相同使用文件主权限,不再查组和其他用户的权限文件主与进程主不同,但文件主与进程主同组只使用组权限,不使用关于其他用户的权限文件主与进程主不同,文件主与进程主又不同组使用文件关于其他用户的权限。 注:超级用户roo
40、t不受权限的限制,确定文件的权限,使用ls命令的有关选项-l和-d ls -l 可以查当前目录下所有文件和子目录的权限 drwxrwx- 3 bin backup 512 Jul 11 07:31 sysadmin drwxr-xr-x 2 bin bin 512 Jul 11 07:21 tabset drwxr-xr-x 3 bin bin 512 Jul 11 11:55 tcl -r-r-r- 1 bin bin 7820 Jul 11 11:53 tclXmain.o drwxr-xr-x 10 bin bin 512 Jul 11 07:32 tcprt ls -1d . 列出当前
41、目录自身的权限 drwxr-xr-x 51 bin bin 4608 Aug 15 16:51 .,修改权限,chmod ugoa+-=rwx 文件名表 字母形式 u-user 文件主的权限 g-group 同组用户的权限 o-other 其他用户权限 a-all 所有上述三种权限 数字形式(八进制数字),如: 八进制: 6 7 4 权限: rw- rwx r 注: 只允许文件主和超级用户修改文件权限 【例4-28】文件和目录的权限对文件和目录操作的限制,umask命令,功能:决定文件/目录的初始权限例如,当用vi新建文件,或用输出重定向创建文件,或创建新目录时,文件的初始权限受umask命令
42、设置的umask值的影响。该值是进程属性的一部分 umask是shell的内部命令 命令格式umask 显示当前的umask值umask 022 将umask值设置为八进制的022,umask命令,umask值的含义对普通文件:rw权限受影响,初始权限中无x权限对目录文件:rwx权限均受掩码值影响umask值= 022 二进制: 000010010 普通文件: rw-r-r- 目录: rwxr-xr-x 一般将umask命令放到自动执行批处理文件中,与文件权限相关的系统调用,修改已存文件的权限 int chmod(char *path, mode_t mode); int fchmod(int
43、 fildes, mode_t mode); 系统调用umask 修改进程自身的umask属性值 int umask(int mask); mask为指定的新umask值,返回值为原先的umask值 读出进程umask属性而不改变它,需调umask两次 【例4-29】umask和open中的权限参数共同确定了新文件的初始权限,SUID权限和SGID权限,SUID权限/SGID权限是程序文件特有的一种权限,有这种权限的程序,其属主/用户组等于变相赋予执行该程序的用户在执行该程序时以属主/用户组的ID。 实际上,用户在执行进程时总有两个ID:一个是用户自身ID,另一个是程序文件属主/用户组给予的I
44、D。前者称为实际UID,后者称为有效UID。 当程序文件属主/用户组给予程序文件SUID权限/SGID权限时,实际UID有效UID。,进程实际UID/有效UID,进程proc结构中含有p_uid域和p_suid域,一般情况下,进程的实际UID和有效UID相等 打开文件时,文件系统将根据进程的有效UID,与文件所有者UID之间的关系和文件的权限进行访问合法性验证 SUID使得用户可以通过文件主提供的程序来访问一个文件主未授予他访问权限的文件,这种访问依赖于文件主提供的程序,进行有限的访问,SUID权限和SGID权限的设置,只有文件主才能赋予或删除SUID权限 chmod us 程序文件名列表 文件有组执行权限,才能赋予或删除SGID权限chmod gs程序文件名列表 SUID/SGID权限的文件在ls -l列表时,文件主/组执行权限处显示小写字母s,而不是x 【例4-30】 SUID权限的使用,