109
第4第 UNIX 第第第第第第

第 4 章 UNIX 的文件和目录

  • Upload
    lonna

  • View
    228

  • Download
    0

Embed Size (px)

DESCRIPTION

第 4 章 UNIX 的文件和目录. 本章主要内容. 文件和目录的层次结构,命名规则,文件通配符 文件管理,目录管理 文件的归档与压缩处理 文件系统的存储结构 硬连接和符号连接 系统调用 文件和目录的访问 文件和目录的权限. 4.1 文件和目录的层次结构. 文件和目录的布局 (1). /etc 目录 供系统维护管理用的命令和配置文件 passwd , hosts 文件 issue 文件:登录前在 login 之上的提示信息 motd 文件:登录成功后的显示信息 - PowerPoint PPT Presentation

Citation preview

Page 1: 第 4 章  UNIX 的文件和目录

第 4 章 UNIX 的文件和目录

Page 2: 第 4 章  UNIX 的文件和目录

第 4 章 第 2页

本章主要内容文件和目录的层次结构,命名规则,文件通配符

文件管理,目录管理文件的归档与压缩处理

文件系统的存储结构硬连接和符号连接

系统调用文件和目录的访问文件和目录的权限

Page 3: 第 4 章  UNIX 的文件和目录

第 4 章 第 3页

4.1 文件和目录的层次结构

Page 4: 第 4 章  UNIX 的文件和目录

第 4 章 第 4页

文件和目录的布局 (1) /etc 目录

供系统维护管理用的命令和配置文件 passwd , hosts 文件 issue 文件:登录前在 login 之上的提示信息 motd 文件:登录成功后的显示信息 rc.d 目录:开机自动执行的命令集合 , 又分成 0,1,

2,...,9 十个阶段 , 分别对应 10 个目录 系统维护命令: fsck , mount , shutdown

Page 5: 第 4 章  UNIX 的文件和目录

第 4 章 第 5页

文件和目录的布局 (2) /tmp

存放临时文件 /bin

系统常用命令,如 ls , ln , cp , cat 等 /dev

存放设备文件,如终端设备,磁带机,打印机等 /usr/include

C 语言头文件存放目录 /usr/tmp

存放临时文件 /usr/bin

存放一些常用命令,如 ftp , make 等

Page 6: 第 4 章  UNIX 的文件和目录

第 4 章 第 6页

文件和目录的布局 (3) /lib,/usr/lib

存放各种库文件,指 C 语言的链接库文件,以及 terminfo 终端库等等

静态链接库文件有 .a 后缀 (archive, 存档 )动态链接库文件后缀是 .so(shared objects) UNIX 广泛使用动态链接库,静态链接库逐渐过时

/usr/spool 存放与用户有关的一些临时性文件,如:打印队列,

已收到但未读的邮件等等

Page 7: 第 4 章  UNIX 的文件和目录

第 4 章 第 7页

4.2 文件和目录命名规则

Page 8: 第 4 章  UNIX 的文件和目录

第 4 章 第 8页

文件和目录的命名规则 名字长度

允许 1 - 255 字符有些 UNIX 不支持长文件名,但至少长度为 1-14

取名的合法字符除斜线外的所有字符都是命名的合法字符不可打印字符也可以做文件名 ( 除了字节 0 ) 斜线留做路径名分割符

大小写字母有区别

Page 9: 第 4 章  UNIX 的文件和目录

4.3 shell的文件通配符处理

Page 10: 第 4 章  UNIX 的文件和目录

第 4 章 第 10页

文件通配符规则( 1 ) 星号 *

匹配任意长度的文件名字符串 ( 包括空字符串 )点字符 (.) ,当它作为文件名或路径名分量的第一

个字符时,必须显式匹配斜线 (/) 也必须显式匹配例: *file 匹配 file , makefile ,不匹配 .profile 文

件 try*c 匹配 try1.c try.c try.basic

Page 11: 第 4 章  UNIX 的文件和目录

第 4 章 第 11页

文件通配符规则( 2 ) 问号 ?

匹配任一单字符 方括号 [ ]

匹配括号内任一字符,也可以用减号指定一个范围例 : [A-Z]* *.[ch] [Mm]akefile

注意文件名通配符规则与正则表达式的规则不同,应用

场合不同不同种类 shell 通配符规则会略有些差别

Page 12: 第 4 章  UNIX 的文件和目录

第 4 章 第 12页

与 DOS 文件通配符的区别 (1) 例 1 : UNIX 文件通配符比 DOS 严谨,无二

义性设当前目录下有 xcom.exe xcom.c xcom.objDOS 中 DIR XCOM* 会列出三个文件 DEL XCOM* 删不掉上述任何文件UNIX 不存在二义性解释 ls xcom* 会列出三个文件 rm xcom* 会删除三个文件

例 2: DOS 中 *.* 匹配所有文件 UNIX 中 *.* 要求文件名中必须含有圆点,否则不匹配,如: *.* 与 makefile 不匹配

Page 13: 第 4 章  UNIX 的文件和目录

第 4 章 第 13页

与 DOS 文件通配符的区别 (2) 例 3 :在 DOS 中,无法使用通配串 *temp*

在 UNIX 中对 *temp* 严格按前述规则去理解,而且 *temp*list* 也可用

例 4 :子目录名的匹配在 UNIX 中可以使用 */*.[ch] 通配符, DOS 中不许

例 5 : UNIX 中文件通配符适用所有命令UNIX 中文件通配符允许用于任何命令,而 DOS 中

只能用于 dir/del/copy 等有限的几个命令中UNIX 中命令 cat *.c 可以列出所有的 .c 文件内容,

DOS 中命令 TYPE *.C 不可

Page 14: 第 4 章  UNIX 的文件和目录

第 4 章 第 14页

shell 与 kernel shell

shell 是一个用户态进程对用户提供命令行界面使用操作系统核心提供的功能

kernel :操作系统核心管理系统资源 ( 包括内存,磁盘等 ) 运行在核心态

通过软中断方式对用户态进程提供系统调用接口

Kernel

shell 进程

操作员命令行界面

系统调用接口

用户态

核心态

硬件资源

硬件接口

Page 15: 第 4 章  UNIX 的文件和目录

第 4 章 第 15页

程序获取命令行参数的方式从 main 的两个参数,可获得命令行参数的内容 演示程序 arg.c void main(int argc, char *argv[]){ int i; for (i = 0; i < argc; i++) printf("%d:[%s]\n", i, argv[i]);}编译,链接: cc arg.c -o arg运行 ./arg abc ABCDEF

argv[0]\0/ a gr.

argv[1]

argv[2]

\0cba

A B C D E F \0

Page 16: 第 4 章  UNIX 的文件和目录

第 4 章 第 16页

shell 文件名通配符处理 文件名通配符的处理由 shell 完成,分以下三

步在 shell 提示符下,从键盘输入命令,被 shell 接受shell 对所键入内容作若干加工处理,其中含有对

文件通配符的展开工作 ( 文件名生成 ) ,生成结果命令

执行前面生成的结果命令

Page 17: 第 4 章  UNIX 的文件和目录

第 4 章 第 17页

文件名通配符举例 (1) 设当前目录下只有 try.c , zap.c , arc.c

三文件键入内容 cat *.c 实际执行 cat arc.c try.c zap.c ( 按字典序 )对命令 cat 来说 , 指定了 3 个文件

grep a*.c try.c 与 grep 'a*.c' try.c 的区别设当前目录下有 a1.c 和 a2.c前者实际执行 grep a1.c a2.c try.c

在 a2.c 和 try.c 中查找正则表达式 a1.c后者在 try.c 文件中查找正则表达式 a*.c

Page 18: 第 4 章  UNIX 的文件和目录

第 4 章 第 18页

文件名通配符举例 (2)

键入命令时的简化输入

手工键入 vi m*e 实际执行 vi makefile

手工键入 cd *sna*

实际执行 cd configure-IBM-sna-network.d

Page 19: 第 4 章  UNIX 的文件和目录

第 4 章 第 19页

验证文件通配符处理方式 执行

./arg * ./arg /usr/include/* ./arg */* /usr/*

执行结果与同样 arg.c 在 DOS 下执行结果比较UNIX 由 shell 完成对文件通配符的展开DOS 由命令自身来解释文件通配符

Page 20: 第 4 章  UNIX 的文件和目录

第 4 章 第 20页

4.4 文件管理

Page 21: 第 4 章  UNIX 的文件和目录

第 4 章 第 21页

ls: 文件名列表 基本功能

不给出实参时,列出当前目录下所有文件和目录实参为文件时,列出文件项实参为目录时,列出目录下的所有文件项 在同一命令行中可以指定多个实参

ls 命令有几十个选项控制列表格式,有选择的为每个项目列出某些属性

选项 -F (Flag)若列出的是目录,就在名字后面缀以斜线 / 若列出的是可执行文件,就在名字后面缀以星号 * 若列出的是符号连接文件,就在名字后面缀以符号

@ 若列出的是普通文件,则名字面后无任何标记

Page 22: 第 4 章  UNIX 的文件和目录

第 4 章 第 22页

ls 选项 -F 举例 命令 ls -F 的执行结果举例

bin/ pmd@core tmp/dev/ unix@etc/ usr/lost+found/ var/ mnt/ zap*

Page 23: 第 4 章  UNIX 的文件和目录

第 4 章 第 23页

ls 选项 -l: 长格式列表 (1) 例: ls -l arg

-rwxr-x--x l liang stud 519 Jul 5 15:02 arg

第 1 列:文件属性第 1 字符为文件类型

- 普通文件 b 块设备文件 (Block) d 目录文件 (Dir) c 字符设备文件 (Char) l 符号连接文件 (Link) p 命名管道文件 (Pipe)

文件的访问权限 (rwx 读权限,写权限,可执行权限 )2-4 字符 : 文件所有者对文件的访问权限5-7字符 : 同组用户对文件的访问权限8-10 字符 :其它用户对文件的访问权限

第 2 列:文件 link 数,涉及到此文件的目录项数

Page 24: 第 4 章  UNIX 的文件和目录

第 4 章 第 24页

ls 选项 -l: 长格式列表 (2)-rwxr-x--x l liang stud 519 Jul 5 15:02 arg

第 3 列,第 4 列:文件主的名字和组名 第 5 列

普通磁盘文件:列出文件大小 ( 字节数 )目录:列出目录表大小,不是目录下文件长度和符号连接文件:列出符号连接文件自身的长度字符设备和块设备文件:列出主设备号和次设备号管道文件:列出管道内的数据长度

第 6 列:文件最后一次被修改的日期和时间 第 7 列:文件名

对于符号连接文件,附带列出符号连接文件的内容

Page 25: 第 4 章  UNIX 的文件和目录

第 4 章 第 25页

ls -l举例drwxr-xr-x 3 bin bin 3584 Jul 11 11:55 bin-rw------- 1 root root 164470 Oct 2 11:43 coredrwxr-xr-x 11 bin bin 7168 Oct 18 09:55 devdrwxrwxr-x 27 bin auth 7680 Oct 18 09:55 etcdrwxr-xr-x 2 root root 1024 Jul 11 07:24 lost+founddrwxrwxrwx 2 root bin 512 Jul 28 1998 mntlrwxrwxrwx 1 root root 35 Jul 11 07:31 pmd -> /var

/opt/K/SCO/Unix/5.0.5Eb/pmd/pmddrwxrwxrwt 2 sys sys 4096 Oct 18 10:48 tmplrwxrwxrwx 1 root sys 11 Jul 11 07:31 unix -> /stan

d/unixdrwxrwxr-x 25 root auth 512 Oct 2 17:18 usrdrwxr-xr-x 6 root sys 512 Jul 11 07:43 varcrw-r--r-- 1 bin ter 0, 9 Oct 18 09:56 /dev/tty10 prw-r--r-- 1 root sys 2642 Oct 18 11:07 /tmp/pipe

Page 26: 第 4 章  UNIX 的文件和目录

第 4 章 第 26页

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

Page 27: 第 4 章  UNIX 的文件和目录

第 4 章 第 27页

cp: 拷贝文件 ( 例 2) 例 2: cp bak.d/p*.c 命令

实际执行 cp bak.d/pl.c bak.d/p2.c结果文件 p1.c 将覆盖掉 p2.c与 DOS 的 COPY BAK.D/P*.C 执行结果不同将这两个文件拷贝到当前目录下的正确用法:cp bak.d/p*.c .

当前目录

p1.c bak.d

p2.c

p2.c

p1.c

Page 28: 第 4 章  UNIX 的文件和目录

第 4 章 第 28页

mv: 移动文件 格式 1

mv file1 file2mv file1 file2 ... filen dirmv dir1 dir2

功能使用 mv 命令可以将文件和目录改名可以将文件和子目录从一个目录移动到另一个目录

Page 29: 第 4 章  UNIX 的文件和目录

第 4 章 第 29页

rm: 删除文件 命令格式

rm file1 file2 ... filen 例

rm core a.out rm *.o *.tmprm * .bak

选项-r 递归地 (Recursive) 删除实参表中的目录,也就是删除一整棵目录树。

-i 每删除一个文件前需要操作员确认 (Inform)-f 强迫删除 (Force) 。只读文件也被删除并且无提示

其它问题正在运行的可执行程序文件不能被删除

Page 30: 第 4 章  UNIX 的文件和目录

第 4 章 第 30页

显式地区分命令选项和处理对象 问题

设当前目录下只有 a , b , c三个文件rm -i

who>-i

rm -i

rm *

cat *

ls *

解决方法许多 UNIX 命令 ( 如 cp , ls , mv , rm , cat ,grep , set 等 ) 用 -- 显式地标志命令行选项的结束,识别以 - 开头的处理对象。如 : rm -- -i ( 删除文件 -i)

只提供选项,未指定任何文件,命令格式错生成文件 -i( 符合文件的命名规则 )不能删除文件 -i

rm -i a b c

cat -i a b c

ls -i a b c

Page 31: 第 4 章  UNIX 的文件和目录

第 4 章 第 31页

4.5 目录管理

Page 32: 第 4 章  UNIX 的文件和目录

第 4 章 第 32页

路径名 绝对路径名与相对路径名

路径分量分隔符用斜线 / ,而不是反斜线 \例如 /usr/stud/liu test/data1/cfg

当前工作目录当前工作目录是进程属性的一部分,每进程一个没有逻辑盘的概念

文件 . 与 ..在目录表中确实有两个文件这两个目录项由系统创建和删除

主目录 (Home Directory)每个用户都有自己独立的主目录用 env 命令查环境变量 HOME 的值

Page 33: 第 4 章  UNIX 的文件和目录

第 4 章 第 33页

打印 / 改变当前目录 pwd 命令:打印当前工作目录

print working directory

cd 命令:改变当前工作目录 (Change Directory)cd /usr/includecd / 斜线前必须有空格cd ..cd 命令无实参

在 DOS 中,打印当前工作目录在 UNIX 中,回到用户的主目录 (Home Directory)

注意cd 是 shell 的一个内部命令

Page 34: 第 4 章  UNIX 的文件和目录

第 4 章 第 34页

创建 / 删除目录 创建目录 mkdir

例: mkdir sun/work.dmkdir 除创建目录外,系统自动建立文件 . 与 ..

删除目录 rmdir 例: rmdir sun/work.d要求被删除的目录除 . 与 .. 外无其它文件或目录其他命令: rm -r sun/work.d

Page 35: 第 4 章  UNIX 的文件和目录

第 4 章 第 35页

cp: 复制目录 cp 命令选项– r ,递归地复制一个目录 cp -r dir1 dir2

若 dir2 不存在,则新建子目录,并将 dir1 下内容拷入若 dir2 已存在,则将所有文件拷入目录 dir2

选项– v ,冗长 (verbose) 方式复制时列出所拷贝的文件名

选项– u ,增量拷贝 (update) ,便于备份目录根据文件的时戳,不拷贝相同的或者过时的版本的文

件,以提高速度dir1 和 dir2 不慎颠倒位置,不会出现灾难性后果DOS 中类似功能的命令 XCOPY ,选项 /D 可以用来实现增量拷贝 (Date)

Page 36: 第 4 章  UNIX 的文件和目录

第 4 章 第 36页

cp: 复制目录 ( 举例 ) 复制目录

将目录 work.d 复制为 bak.dcp -r work.d bak.d

增量拷贝将 work.d 中的内容增量拷贝到备份目录 bak.d 中cp -ruv work.d bak.d

命令 touch 将文件的最后一次修改时间设置为当前时间,但不修改文件内容。例如: touch *.[ch]

Page 37: 第 4 章  UNIX 的文件和目录

第 4 章 第 37页

find: 在目录中查找文件 功能

find 命令从指定的查找范围开始,递归地查找子目录,凡满足条件的文件或目录,执行规定的动作

举例find verl.d ver2.d -name '*.c' -print查找范围:当前目录的子目录 ver1.d 和 ver2.d条件:与名字 *.c 匹配。注 :*.c 应当用引号括起动作:把查找到的文件的路径名打印出来

命令的特点功能强,选项较多递归式查找,提供了一种遍历目录树的手段,其它

命令经常借用 find 的“递归式查找”特性

Page 38: 第 4 章  UNIX 的文件和目录

第 4 章 第 38页

find 关于条件的选项 (1)-name wildcard

文件名匹配,允许使用文件通配符 ( 注意必需的引号 )-type

f: 普通文件 d: 目录 l: 符号连接文件 c: 字符设备文件 b: 块设备文件 p: 管道文件

-inum i-node-number 指定 i 节点号-size ±nbytesc 指定文件字节数-size ±nblocks 指定磁盘存储块数-mtime ±ndays 文件最近修改时间-atime ±ndays 最近访问 ( 读 / 执行 ) 时间

Page 39: 第 4 章  UNIX 的文件和目录

第 4 章 第 39页

find 关于条件的选项 (2) 其它条件选项

可指定文件主 -user , -nouser可指定用户组 -group , -nogroup指定 link 数 -links指定路径深度 -depth指定文件的访问权限 -perm

复合条件可以用 ! () -o 等表示多条件的与 / 或 / 非

Page 40: 第 4 章  UNIX 的文件和目录

第 4 章 第 40页

find 关于动作的选项 -print

打印查找的文件的路径名 -exec

对查找到的目标执行某一命令在 -exec 及随后的分号之间的内容作为一条命令,{} 代表所查到的路径名

-ok与 -exec 类似,只是对查找到符合条件的目标执行

一个命令前需要经过确认

Page 41: 第 4 章  UNIX 的文件和目录

第 4 章 第 41页

find 使用举例 (1) find . -type d -print

从当前目录开始查找,寻找所有目录,打印路径名按层次列出当前的目录结构

find / -name 'stud*' -type d -print指定了两个条件:名字与 stud* 匹配,类型为目录两个条件逻辑“与”,必须同时符合这两个条件

find / -type f -mtime -10 -print从根目录开始检索最近 10 天之内曾经修改过的普通

磁盘文件

Page 42: 第 4 章  UNIX 的文件和目录

第 4 章 第 42页

find 使用举例 (2) find . -atime +30 -mtime +30 -print

从当前目录开始检索最近 30 天之内既没有读过,也没有写过,而且也没有被当作命令执行过的文件

筛选出一个时间周期内不活跃的文件 find . ! -type d -links +2 -print

从当前目录开始检索 link 数大于 2 的非目录文件条件“非”用!注意: ! 号与 -type 之间必须保留一空格

Page 43: 第 4 章  UNIX 的文件和目录

第 4 章 第 43页

find 使用举例 (3) find / -size +100000c \( -name core -o -name

'*.tmp' \) -print寻找大于 100K 的名叫 core 或有 .tmp 后缀使用了两条件“或” (-o) 及组合 ( 圆括号 )不要遗漏了所必需的引号,反斜线和空格,尤其是圆

括号前和圆括号后。圆括号是 shell 的特殊字符其他写法find / -size +100000c '(' -name core -o -name \*.tmp

')' -printfind / -size +100000c \( -name core –o -name \*.tmp

')' -print

Page 44: 第 4 章  UNIX 的文件和目录

第 4 章 第 44页

find 使用举例 (4) find / -name make -print -exec ls -l {} \;

-exec 及随后的分号之间的内容作为一条命令执行shell 中分号有特殊含义,前面加反斜线 \{} 代表所查到的符合条件的路径名。注意,两花括号间无空格,之后的空格不可省略

-ok 选项在执行指定的命令前等待用户确认find / -size +100000c \( -name core -o name '*.tm

p' \) -ok rm {} \ ;

Page 45: 第 4 章  UNIX 的文件和目录

第 4 章 第 45页

find 使用举例 (5)利用 find 的递归式遍历目录的功能 find src -name \*.c -exec grep -- -help {} /dev/

null \;在目录 src 中所有 .c 文件中查找 -help 字符串

将当前目录下所有文件拷贝到目录 ../bak 中去执行 cp * ../bak 命令:如果当前目录下文件太多 shell扩展 * 时失败,从而不能执行期望的功能

用 find 命令与 cp 命令配合工作find . -type f -maxdepth 1 -exec cp {} ../bak \;选项 -maxdepth 1 将 find 的搜索深度限制为最多 1 层,如果当前目录有子目录,就不再检索子目录

Page 46: 第 4 章  UNIX 的文件和目录

第 4 章 第 46页

4.6 文件的归档与压缩处理

Page 47: 第 4 章  UNIX 的文件和目录

第 4 章 第 47页

tar: 文件归档 (1) 功能

tar 命令最早为顺序访问的磁带机设备而设计的 (Tape ARchive ,磁带归档 ) ,用于保留和恢复磁带上的文件

命令用法tar [ctxu][v][f device] file-list

选项第一字母指定要执行的操作,是必需的c: Create 创建新磁带。从磁带的头上开始写,以前

存于磁带上的数据会被覆盖掉t: Table 列表。磁带上的文件名列表,当不指定文

件名时,将列出所有的文件

Page 48: 第 4 章  UNIX 的文件和目录

第 4 章 第 48页

tar: 文件归档 (2)x: eXtract 抽取。从磁带中抽取指定的文件。当不指

定文件名时,抽取所有文件。如果磁带上有多个同名文件时,最后一个文件将覆盖所有较早同名文件

u: Update 更新。把文件追加到磁带尾部,这个文件的某个版本可能已经存放到磁带上。为了兼顾磁带顺序访问特点,新版本文件追加到文件尾部,旧版本文件仍保留

除功能字母外的其它选项v: Verbose 冗长。 tar 每处理一个文件,就打印出

文件的文件名,并在该名前冠以功能字母f: File 指定设备文件名j: Linux 中的选项,文件采用压缩格式

Page 49: 第 4 章  UNIX 的文件和目录

第 4 章 第 49页

tar 命令使用举例 (1) tar cvf /dev/rct0 .

将整棵当前目录树,备份到设备 /dev/rct0 中,圆点目录是当前目录

tar xvf /dev/rct0将磁带设备 /dev/rct0 上的数据恢复到文件系统中

tar tvf /dev/rct0打印磁带设备 /dev/rct0 上的文件目录

tar uf /dev/rct0 test.c 磁带备份完成之后,文件 test.c 又发生了变化,将更新过的 test.c 追加到磁带尾部

Page 50: 第 4 章  UNIX 的文件和目录

第 4 章 第 50页

tar 命令使用举例 (2) tar cvf my.tar *.[ch] makefile

指定普通文件代替设备文件,将多个文件或目录树存储成一个文件。这是早期的文件和目录打包工具

这一命令危险的误操作是: tar cvf *.[ch] makefile 漏掉了必需的“设备文件名”,按照 shell 对文件名的展开规则,可能会冲掉现存的某一文件

tar cvf a1.c a2.c ab.h makefile

Page 51: 第 4 章  UNIX 的文件和目录

第 4 章 第 51页

tar 命令使用举例 (3) 目录打包

设 work1 是一个复杂的有多个层次的子目录 tar cvf work1.tar work1 从归档文件中恢复数据的命令: tar xvf work1.tar

Page 52: 第 4 章  UNIX 的文件和目录

第 4 章 第 52页

文件压缩和解压缩 命令 compress 和 uncompress

采用 LZW算法对文件压缩,是一种字典压缩算法压缩算法对文件中有规律的数据内容压缩效率很高普通文本文件可压掉 50-80%有许多空白字段的数据库文件甚至可压掉 90% 以上压缩完的文件名后缀是 .Z

举例compress ch5 压缩,生成新文件 ch5.Zzcat ch5.Z 读取压缩格式的文件uncompress ch.Z 解压缩 ,还原文件 ch5

Linux 的文件压缩 / 解压缩工具gzip/gunzip

Page 53: 第 4 章  UNIX 的文件和目录

第 4 章 第 53页

文件归档与压缩的应用 通用性

文件归档 tar 与压缩处理 compress 在不同 UNIX 系统间有通用性。可以用来在不同 UNIX 中交换程序或数据

举例:在两台主机之间拷贝一棵目录树在主机 A

tar cvf abc.tar abc 将目录 abc 存到文件 abc.tarcompress abc.tar 压缩生成文件 abc.tar.Z(惯例:后缀为 .tar.Z 的文件)将文件 abc.tar.Z 通过网络传到主机 B

主机 Buncompress abc.tar.Ztar xvf abc.tar

Page 54: 第 4 章  UNIX 的文件和目录

第 4 章 第 54页

4.7 文件系统的存储结构

Page 55: 第 4 章  UNIX 的文件和目录

第 4 章 第 55页

根文件系统与子文件系统 根文件系统 (root filesystem)

根文件系统是整个文件系统的基础,不能 “脱卸 (umount)”

子文件系统子文件系统,包括硬盘,软盘, CD-ROM , USB盘,网络文件系统 NFS ,都以根文件系统中某一子目录的身份出现,不象 DOS那样使用逻辑盘的概念

独立的存储结构根文件系统和子文件系统都有其自己独立的文件系

统存储结构,甚至文件系统的格式也可以不同

Page 56: 第 4 章  UNIX 的文件和目录

第 4 章 第 56页

文件系统 : 创建和安装 (1) (SCO UNIX系统中的命令 )

mkfs /dev/fd0创建文件系统 (make filesystem) 。块设备文件 /dev/fd0 指 A 盘

安装子文件系统 mountmount /dev/fd0 /mnt/mnt 可以是任一个事先建好的空目录名,允许处

于根文件系统的任何目录中,此后,操作子目录 /mnt就是对子文件系统的访问。对于应用程序来说,从所操作的文件或目录名,看不出和其它根文件系统的对象有什么区别

Page 57: 第 4 章  UNIX 的文件和目录

第 4 章 第 57页

文件系统 : 创建和安装 (2) 访问 /mnt 子目录实际上操作子文件系统

cp /usr/include/*.h /mnt rm /mnt/stdio.h mkdir /mnt/jiang cp /usr/jiang/*.[ch] /mnt/jiang vi /mnt/jiang/fn.c ls /mnt

不带参数的 mount 命令列出当前已安装的所有的子文件系统

umount 命令功能与 mount 命令相反,拆除一个已安装的子文

件系统。例如: umount /dev/fd0

Page 58: 第 4 章  UNIX 的文件和目录

第 4 章 第 58页

df: 文件系统空闲空间-v 列出文件存储区总长度 ,空闲空间和百分比-i 列出 i节点使用情况$ dfdf/ (/dev/root ): 710734 blocks 150779 i-nodes/stand (/dev/boot ): 14556 blocks 3824 i-nodes$ df -vdf -vMount Dir Filesystem blocks used free %used/ /dev/root 1612078 901344 710734 56%/stand /dev/boot 30720 16164 14556 53%$ df -idf -iMount Dir Filesystem iused ifree itotal %iused/ /dev/root 50733 150779 201512 26%/stand /dev/boot 16 3824 3840 1%$ df -vidf -viMount Dir Filesystem blocks used free %used iused ifree %iused/ /dev/root 1612078 901344 710734 56% 50733 150779 26%/stand /dev/boot 30720 16164 14556 53% 16 3824 1%

Page 59: 第 4 章  UNIX 的文件和目录

第 4 章 第 59页

文件系统的结构 (1) 把整个逻辑设备以 512 字节为块 (扇区 )划分,编号为 0

, 1 , 2 , ...。

引导块

专用块

i 节 点 区 文 件 存 储 区

引导块 (0 号块 )用于启动系统,只有根文件系统的引导块有效

专用块 (1 号块 ) :也叫管理块,或者超级块存放与整个文件系统的管理有关的信息。如:文件

系统的大小, i 节点区的大小,空闲空间大小,空闲块链表的头等等

Page 60: 第 4 章  UNIX 的文件和目录

第 4 章 第 60页

文件系统的结构 (2) i 节点区

i 节点 (index node ,简记为 i-node)i 节点区由若干块构成,在文件系统创建时确定每磁盘块可容多个 i 节点,每个 i 节点为 64 字节i 节点编号:从 1 开始。 1 , 2 , 3 , ...每个文件都对应一个 i 节点每个 i 节点中的数据

指向文件存储区数据块的一些索引指针文件类型,属主,组,权限, link 数,大小,时戳i 节点内不含文件名

文件存储区 用于存放文件数据的区域,包括目录表

Page 61: 第 4 章  UNIX 的文件和目录

第 4 章 第 61页

目录存储结构 树形带交叉勾连的目录结构 目录表

每个目录表也作为一个文件,存于“文件存储区”中,有其自己的 i 节点

目录表由一个个“目录项”构成每个目录项由“文件名 -i 节点号”对构成用 ls 命令列出的目录大小是目录表本身的长度

Page 62: 第 4 章  UNIX 的文件和目录

第 4 章 第 62页

目录存储结构示意图

a0a31ax0ax31

.

.

.

bnb31bx0bx31

.

.

.

目录/ a0的i节点

根目录/

目录/ a0 文件/ a0/ bn

根目录i节点文件/ a31文件/ a0/ bx3

文件/ a0/ b31文件/ a0/ bx0

文件/ ax0

文件/ ax31

i节点

i节点

i节点

i节点

i节点

Page 63: 第 4 章  UNIX 的文件和目录

第 4 章 第 63页

目录表和 i 节点两级结构 (1) 主要目的

分开存放的主要目的是为了提高目录检索效率 假定的环境

存储文件名使用定长 14 字节,索引信息需要 64 字节每磁盘块 512 字节当前目录下有 100 个文件,需要访问的文件的文件名 m

ydata.bin 存放在目录表的最末尾处 方案一:一级结构

文件名和索引信息存放在一起 , 放在目录表中每个目录项78 字节,每块可容纳 512÷78=6个目录项读入目录直到第 17 块才找到 mydata.bin 以及索引信息

Page 64: 第 4 章  UNIX 的文件和目录

第 4 章 第 64页

目录表和 i 节点两级结构 (2) 方案二:两级结构

文件名和索引信息分开,索引信息存放在 i 节点中,目录表中仅记录文件名和 i 节点的 2 字节编号

每个目录项 16字节,一个磁盘块含 512÷16=32 个目录项

读入 4 块就检索到名字 mydata.bin 的 i 节点号根据 i 节点号读取 i 节点,读入 i 节点区的一个磁盘块总共磁盘操作 5 块,就可以根据名字找到文件的索引

信息 两种方案的比较

后者需要更少的磁盘访问次数文件系统采用这样的存储结构,完全可以在同一目录

或者不同目录中的两个目录项,有相同的 i 节点号

Page 65: 第 4 章  UNIX 的文件和目录

第 4 章 第 65页

4.8 硬连接和符号连接

Page 66: 第 4 章  UNIX 的文件和目录

第 4 章 第 66页

硬连接目录表由目录项构成,目录项是一个“文件名 -i 节点号”

对根据文件系统的存储结构,完全可以在同一目录或者不同

目录中的两个目录项,有相同的 i 节点号每个目录项指定的文件名 -i 节点号映射关系,叫做硬连接硬连接数目 (link 数 ) :同一 i 节点被目录项引用的次数

Page 67: 第 4 章  UNIX 的文件和目录

第 4 章 第 67页

ln: 普通文件的硬连接$ ln chapt0 intro$ ls -l chapt0 intro-rw-rw-rw- 2 kc kermit 17935 Dec 12 18:07 chapt0-rw-rw-rw- 2 kc kermit 17935 Dec 12 18:07 intro

(前面的几项必相同 ,为什么? )$ ls -i chapt0 intro 13210 chapt0 13210 intro

chapt0 与 intro 同时存在时,地位完全平等删 chapt0 文件,则 intro 仍存在但 link 数减

1硬连接,只限于同一文件系统中的普通文件

Page 68: 第 4 章  UNIX 的文件和目录

第 4 章 第 68页

目录表的硬连接 不允许对目录用 ln 命令建立硬连接 一般来说 , 目录的 link 数 =直属子目录数 +2

custom

home

liujiangbin

cal arpbc paperdata2data1 proj

Page 69: 第 4 章  UNIX 的文件和目录

第 4 章 第 69页

目录表的硬连接示意图...calbcarp

...

data1data2

...

paperproj

...bin

jiangliu

...

home

Page 70: 第 4 章  UNIX 的文件和目录

第 4 章 第 70页

符号连接 符号连接也叫软连接

用特殊文件“符号连接文件”来实现文件中仅包括了一个路径名命令 ln -s 和 ls -l

ln -s users_on sym.linkls -l sym.linklrwxrwxrwx 1 guest other 8 Jul 26 16:57 sym.link->users_on类型为 l ,大小为 8字节,文件中只存放 users_on 字符串

文件的最后一次写时间以后不再变化一旦建立了符号连接,删除操作删除的是符号连接文件,其它所有操作都将访问符号连接所引用的文件

Page 71: 第 4 章  UNIX 的文件和目录

第 4 章 第 71页

符号连接的实现

.

.

.users_on

.

.

.sym.link

.

.

.

当前目录表

i节点

i节点类型:普通文件

类型:符号连接文件

users_on

"符号连接文件"的内容

数据文件的内容

Page 72: 第 4 章  UNIX 的文件和目录

第 4 章 第 72页

符号连接的规则 系统处理路径名分量时发现符号连接,就把符号连接

内容加到路径名的剩余部分的前面产生结果路径名 若符号连接包含绝对路径名,使用绝对路径名 否则,根据在文件层次中该连接的相对位置,计算符

号连接内容 ( 不是根据调用进程的当前的工作目录 )

d

d2d1

d1b d1a

设当前目录为 dln -s d1/dlb d1/dx在 d1下新建文件 dx访问 d1/dx实际访问 d1/d1/d1b

Page 73: 第 4 章  UNIX 的文件和目录

第 4 章 第 73页

硬连接与符号连接的比较 硬连接

在数据结构层次上实现只适用于文件,不适用于目录不同文件系统之间也不行硬连接能够完成的功能软连接可以做到

符号连接在算法软件上实现硬连接能够完成的功能软连接可以做到适用于目录,也适用于不同的文件系统但同硬连接相比要占用操作系统内核的一部分开销循环式符号连接,以及处理方法

Page 74: 第 4 章  UNIX 的文件和目录

第 4 章 第 74页

4.9 系统调用

Page 75: 第 4 章  UNIX 的文件和目录

第 4 章 第 75页

系统调用 (System call) 系统调用的基本概念

是操作系统的内核提供的编程界面是应用程序和操作系统进行交互的唯一手段例如:文件操作的 open , read , write , close和普通的库函数调用在执行方式上的区别UNIX 第 7 版 50 多个, SVR4 扩充到 120 个调用函数的名字,参数排列顺序,参数的类型定义,返回值的类型,以及实现的功能,都属于 POSIX 标准来规范的内容

Page 76: 第 4 章  UNIX 的文件和目录

第 4 章 第 76页

系统调用返回值返回值

UNIX 的系统调用一般都返回一个整数值返回值大于或等于零:成功返回值为 -1 :失败

整型变量 errno标准库为 errno 保留存储空间,系统调用失败后填写错误代码,记录了失败原因

#include <errno.h> 之后,就可以直接使用 errnoerrno.h 头文件定义了许多有 E 前缀的宏,例如

EACCESS , EIO , ENOMEM , EINTR相关系统调用的手册页中有出错说明

Page 77: 第 4 章  UNIX 的文件和目录

第 4 章 第 77页

strerror 与 perror strerror

char *strerror(int errno);errno便于程序识别错误原因,不便于操作员理解失败原因。库函数 strerror 将数字形式的错误代码,转换成一个可阅读的字符串

perrorvoid perror(char *string);在标准错误输出上产生一消息,描述 errno 的错误格式:先打印字符串 string ,再打印出一个冒号和

空格 ,然后再打印出这条消息和换行符

Page 78: 第 4 章  UNIX 的文件和目录

第 4 章 第 78页

4.10 文件和目录的访问

Page 79: 第 4 章  UNIX 的文件和目录

第 4 章 第 79页

系统调用 stat/fstat从 i 节点获得文件的状态信息stat 得到指定文件名的 i 节点fstat 得到已打开文件的 i 节点stat 和 fstat 将数据放入调用者提供的 stat 结构中

#include <sys/types.h>#include <sys/stat.h>

int stat(char *path, struct stat *sbuf); /* return O on success or -1 on error */

int fstat(int fd, struct stat *sbuf); /* returns O on success or -1 on error */

Page 80: 第 4 章  UNIX 的文件和目录

第 4 章 第 80页

数据结构 stat(1)struct stat { dev_t st_dev; // 包含 i 节点的设备的设备号 ino_t st_ino; // i 节点号 mode_t st_mode; // 文件方式,总共 16比特 nlink_t st_nlink;// link数 (short型 ) uid_t st_uid; // 文件主 ID gid_t st_gid; // 用户组 ID dev_t st_rdev; // 设备文件的设备号 off_t st_size; // 文件大小(字节数) time_t st_atime;// 最近访问时间 time_t st_mtime;// 最近修改时间 time_t st_ctime;// 文件最近状态改变时间};

Page 81: 第 4 章  UNIX 的文件和目录

第 4 章 第 81页

数据结构 stat(2) st_mode域: 16比特

文件的基本存取权限和 SUID/SGID 权限 (11比特 )文件的类型 ( 若干比特 ) ,判 st_mode & S_IFMT

S_IFREG 普通磁盘文件S_IFDIR 目录文件S_IFCHR 字符设备文件S_IFIFO 管道文件S_IFLNK 符号连接文件

st_ctime , st_atime , st_mtime域“ 访问”:读,执行“修改”:写“改变”:写,修改权限 /link 数 / 文件主等 i 节点

信息

Page 82: 第 4 章  UNIX 的文件和目录

第 4 章 第 82页

目录访问可以象普通磁盘文件那样,打开目录读取 目录访问的库函数

#include <dirent.h>DIR *opendir(char *dirname);struct dirent *readdir(DIR *dir);int closedir(DIR *dir);

opendir 打开目录,得到句柄( NULL 表示失败) readdir获取一个目录项:返回值指针指向的结构体记录 i 节点号和文件名 (d_ino 和 d_name 成员 )。返回 NULL ,标志目录表已经读到尾

不再使用的目录句柄,用 closedir 关闭

Page 83: 第 4 章  UNIX 的文件和目录

第 4 章 第 83页

目录访问举例 myls.c(1)#include <stdio.h>#include <dirent.h>#include <errno.h>

int main(int argc, char **argv){ DIR *dir; struct dirent *entry; if (argc != 2) { fprintf(stderr, "Usage : %s <dirname>\n", argv[0]); exit(1); } dir = opendir(argv[1]); if (dir == NULL) { printf("Open directory \"%s\": %s (ERROR %d)\n", argv[1], strerror(errno), errno); return 1; }

Page 84: 第 4 章  UNIX 的文件和目录

第 4 章 第 84页

目录访问举例 myls.c(2) while ((entry = readdir(dir)) != NULL) printf("%4d %s \n", entry->d_ino, entry->d_name); closedir(dir); return 0;}

$ ./myls /etc 4110 . 2 ..4111 consdef4112 csh.cshrc4113 csh.login4114 dlpi.conf4115 dumpdates4116 environment4117 filesystems4118 group...

Page 85: 第 4 章  UNIX 的文件和目录

第 4 章 第 85页

上机习题 vi编程实现 UNIX风格程序 myrm.c ,实现与rm 命令相同的功能。体会 UNIX 文件通配符的处理方式, UNIX 命令对选项的处理方式。实现选项 i v r 以及 --

i interactive 交互式,每次删除之前确认v verbose 冗长方式,每执行一次操作都打印出来r recursion 递归方式删除子目录-- 显式的终止命令选项分析举例: ./myrm –ri -- -i a*

Page 86: 第 4 章  UNIX 的文件和目录

第 4 章 第 86页

上机习题 : 参考函数#include <stdio.h>#include <dirent.h>#include <sys/stat.h>

ret= unlink(path); /* 删除文件 */

/* 获取路径名对应的 i 节点中的属性 */struct stat st;ret = stat(path,&st); if(S_ISDIR(st.st_mode)) /* 判断 i 节点属性 */

ret = chdir(".."); /* 修改当前目录到上级目录 */ret = rmdir(path); /* 删除一个空目录 */

Page 87: 第 4 章  UNIX 的文件和目录

第 4 章 第 87页

4.11 文件和目录的权限

Page 88: 第 4 章  UNIX 的文件和目录

第 4 章 第 88页

文件的权限用于控制进程对系统中文件和目录的访问权限的三个级别

文件主,同组用户,其他用户每个文件有唯一的属主

普通文件的权限读、写、可执行不可写文件也可以被删除

Page 89: 第 4 章  UNIX 的文件和目录

第 4 章 第 89页

两类可执行文件程序文件

二进制的 CPU 指令集合,满足规定的格式脚本文件: ASCII 文件

默认的解释程序为 /bin/sh可以在文件的第一行自行指定解释程序,例如: #! /bin/csh 解释程序也可以是用户自己编写的应用程序

Page 90: 第 4 章  UNIX 的文件和目录

第 4 章 第 90页

目录的权限 读权限

若无读权限,那么“目录表”文件不许读, ls 会失败 写权限

若无写权限,那么“目录表”文件不许写创建文件,删除文件,文件改名会修改目录文件修改文件不需要修改目录文件,需要修改 i 节点目录无写权限不是指目录下所有文件禁止写

执行权限有执行权限意味着分析路径名过程中可检索该目录cat /a/b/c 要求 / , /a , /a/b 三目录有 x 权限, c

文件有读权限;否则,命令执行失败cd ../st8 要求当前目录, .. 和 st8 必须有 x 权限

Page 91: 第 4 章  UNIX 的文件和目录

第 4 章 第 91页

权限验证的顺序 文件主与进程主相同

使用文件主权限,不再查组和其他用户的权限 文件主与进程主不同 ,但文件主与进程主同组

只使用组权限,不使用关于其他用户的权限 文件主与进程主不同 , 文件主与进程主又不同

组使用文件关于其他用户的权限。

注:超级用户 root 不受权限的限制 例:可把文件许可权置为文件主不可读但同组

用户可读,即使文件主是该组用户之一也不行

Page 92: 第 4 章  UNIX 的文件和目录

第 4 章 第 92页

确定文件的权限 使用 ls 命令 有关选项 -l 和 -d 例 :ls -l 可以查当前目录下所有文件和子目录的权限drwxrwx--- 3 bin backup 512 Jul 11 07:31 sysadmindrwxr-xr-x 2 bin bin 512 Jul 11 07:21 tabsetdrwxr-xr-x 3 bin bin 512 Jul 11 11:55 tcl-r--r--r-- 1 bin bin 7820 Jul 11 11:53 tclXmain.odrwxr-xr-x 10 bin bin 512 Jul 11 07:32 tcprtdrwxr-xr-x 43 bin bin 1024 Jul 11 07:24 terminfodrwxr-xr-x 3 bin bin 512 Jul 28 1998 terminfo-rw-r--r-- 1 bin bin 6997 Jul 11 06:56 timconv ls -1d . 列出当前目录自身的权限drwxr-xr-x 51 bin bin 4608 Aug 15 16:51 .

Page 93: 第 4 章  UNIX 的文件和目录

第 4 章 第 93页

修改权限 字母形式

chmod [ugoa][+-=][rwx] 文件名表 u--user 文件主的权限 g--group 同组用户的权限 o--other 其他用户权限 a--all 所有上述三级权限 例 : chmod u+rw * chmod go-rwx *.[ch] chmod a+x batch chmod u=rx try2

Page 94: 第 4 章  UNIX 的文件和目录

第 4 章 第 94页

修改权限 ( 续 ) 数字形式 (八进制数字 )

例: chmod 674 xyz1 xyz2

八进制: 6 7 4 二进制: 110 111 100权限: rw- rwx r--

注 : 只允许文件主和超级用户修改文件权限

Page 95: 第 4 章  UNIX 的文件和目录

第 4 章 第 95页

系统调用 chmod 修改已存文件的权限int chmod(char *path, mode_t mode);int fchmod(int fildes, mode_t mode);

Page 96: 第 4 章  UNIX 的文件和目录

第 4 章 第 96页

演示:文件的读写权限 文件的写权限$ who am ijiang pts/2 Jun 06 08:34$ who > mydata$ ls -l mydata-rw-r--r-- 1 jiang usr 58 Jun 06 09:04 mydata$ chmod u-w mydata$ who >> mydata ( 只读文件不许写 )mydata: The file access permissions do not allow the specified action.$ rm mydata ( 只读文件可以被删除 )rm: Remove mydata? y$ ls -l mydatals: 0653-341 The file mydata does not exist.

文件的读权限$ who > mydata$ chmod u-rw mydata$ cat mydata ( 无法读取不允许读的文件中内容 )cat: 0652-050 Cannot open mydata.$ chmod 644 mydata

Page 97: 第 4 章  UNIX 的文件和目录

第 4 章 第 97页

演示:目录的 w 权限 目录写权限$ chmod u-w . ( 当前目录不许写 )$ who > mydata2 ( 不能创建新文件 )mydata2: The file access permissions do not allow the specified action.$ who >> mydata ( 但是可以修改已有的文件 , 追加一部分数据 )$ rm mydata ( 不能删除文件 )rm: 0653-609 Cannot remove mydata.The file access permissions do not allow the specified action.$ cp /etc/passwd mydata ( 可以覆盖旧文件 )$ cp /etc/passwd mydata2 ( 不能创建新文件 ))cp: mydata2: The file access permissions do not allow the specified action.$ mv mydata MyData (文件不许改名 )mv: 0653-401 Cannot rename mydata to MyData: The file access permissions do not allow the specified action.$ mkdir Test ( 不可创建子目录 )mkdir: 0653-357 Cannot access directory ...: The file access permissions do not allow the specified action.

Page 98: 第 4 章  UNIX 的文件和目录

第 4 章 第 98页

演示:目录的 r 权限 目录读权限$ pwd/usr/jiang$ chmod u-r .$ ls ( 不可读的目录无法列表出其中文件 )ls: .: The file access permissions do not allow the specified action.$ chmod 000 . ( 取消当前目录所有权限 )$ ls ls: 0653-345 .: Permission denied.$ chmod 755 . (试图恢复当前目录权限失败,因为试图访问当前目录下的 . 文件 )chmod: .: The file access permissions do not allow the specified action.$ chmod 755 /usr/jiang ( 这种访问不需要当前目录权限,可恢复当前目录权限 )

Page 99: 第 4 章  UNIX 的文件和目录

第 4 章 第 99页

演示:目录的 x 权限子目录没有读写权限,但是保留了 x 权限$ chmod u=x ttt$ cat ttt/ccp.c main(int argc, char **argv){ ...}$ rm ttt/arg.c ( 子目录没有写权限,不能删除其中的文件 )rm: 0653-609 Cannot remove ttt/arg.c.The file access permissions do not allow the specified action.$ ls ttt ( 子目录没有读权限,不能列出其中的文件 )ls: ttt: The file access permissions do not allow the specified action.子目录有读写权限 , 但没有 x 权限$ chmod u=rw ttt$ ls tttBUGS.report arg.c ccp.c chap.h mydataarg auth.c chap.c disk.img$ cat ttt/arg.c cat: 0652-050 Cannot open ttt/arg.c.(试图设置其他用户的文件或目录的权限 )$ chmod 777 /chmod: /: Operation not permitted.

Page 100: 第 4 章  UNIX 的文件和目录

第 4 章 第 100页

umask 命令 (1) 功能:决定文件 / 目录的初始权限

用 vi 新建文件用输出重定向创建文件创建新目录

umask 是进程属性的一部分umask 是 shell 内部命令umask 是进程属性的一部分

命令umask 打印当前的 umask 值umask 022 将 umask 值设置为八进制的 022

Page 101: 第 4 章  UNIX 的文件和目录

第 4 章 第 101页

umask 命令 (2)掩码值的含义

普通文件: rw 权限受影响,初始权限中无 x 权限 目录文件: rwx 权限均受掩码值影响例:掩码值 : 022

二进制: 000010010普通文件: rw-r--r-- 目录: rwxr-xr-x

自动执行批处理文件一般将 umask 命令放到自动执行批处理文件中

用 csh 作登录 shell 时,加入到 .login 或 .cshrc 文件用 sh 作登录 shell 时,加入到 .profile 文件bash 的 $HOME/.bashrc

Page 102: 第 4 章  UNIX 的文件和目录

第 4 章 第 102页

系统调用 umask 功能

修改进程自身的 umask 属性值初创文件的权限

受 open 的规定值和进程自身属性 umask 值影响已存在的文件的权限,不受 open/umask 的影响

例 : 当 umask 为 077 时,用 C 程序 fd=open(filename,O_CREAT|O_WRONLY,0666); open 的权限为 0666 ,屏蔽掉 077后实际为 0600

系统调用 umask int umask(int mask); mask 为指定的新 umask 值,返回值为原先的 umask 值读出进程 umask 属性而不改变它,需调 umask 两次

Page 103: 第 4 章  UNIX 的文件和目录

第 4 章 第 103页

SUID 权限和 SGID 权限

Page 104: 第 4 章  UNIX 的文件和目录

第 4 章 第 104页

三级权限存在的问题 问题

系统中任一个用户,要么对文件的全部内容具有访问权,要么不可访问文件。有的情况下,很不方便

举例用户 liu 的文件 list.txt :希望用户 liang ,只

能读取行首为 #的行和与用户 liang 有关的行#======================================# 登录名 工作证号 姓名 月份 工资 奖金 补助 扣除 总额#-------------------------------------------------------------------- tian 2076 田晓星 03 1782 1500 200 175 3307 liang 2074 梁振宇 03 1560 1400 180 90 3050 sun 3087 孙东旭 03 1804 1218 106 213 2915 tian 2076 田晓星 04 1832 1450 230 245 3267 liang 2074 梁振宇 04 1660 1450 230 70 3270 sun 3087 孙东旭 04 1700 1310 283 270 3023#======================================# 注:煤气费不再从工资中扣除,由煤气公司自行收缴。

Page 105: 第 4 章  UNIX 的文件和目录

第 4 章 第 105页

用户 liu 的程序 query.c 1 #include <stdio.h> 2 #include <string.h> 3 void main(void) 4 { 5 FILE *f; 6 char line[512], login_name[16]; 7 f = fopen("list.txt", "r"); 8 if (f == NULL) { 9 perror("*** ERROR: Open file \"list.txt\" ");10 exit(1);11 }12 while (fgets(line, sizeof(line), f)) {13 if (line[0] == '#') {14 printf("%s", line);15 } else {16 if (sscanf(line, "%s", login_name) > 0) {17 if (strcmp(login_name, getlogin()) == 0) 18 printf("%s", line);19 }20 }21 }22 exit(0);23 }

Page 106: 第 4 章  UNIX 的文件和目录

第 4 章 第 106页

简单的三级权限的问题 用户 liu 源程序经过编译后,生成可执行文件 query。为了保密用户 liu将文件 list.txt 的权限设为 rw------- ,文件 query 的权限为 rwx--x—x

$ chmod 600 list.txt$ chmod 711 query$ ls -l list.txt query-rw------- 1 liu leader 722 Dec 10 23:04 list.txt-rwx--x--x 1 liu leader 56134 Dec 10 23:07 query$ 用户 liang 执行命令 query$ query *** ERROR: Open file "list.txt" : Permission denied$ cat list.txt cannot open list.txt: Permission denied

Page 107: 第 4 章  UNIX 的文件和目录

第 4 章 第 107页

SUID 权限 文件 query 的文件主 liu给文件 query 增加 SUID权限$ chmod u+s query$ ls -l query -rws--x--x 1 liu leader 56134 Dec 10 23:07 query 用户 liang 通过 query 命令查询只许 liu可读的文件 list.txt$ ls -l list.txt query -rw------- 1 liu leader 722 Dec 10 23:04 list.txt-rws--x--x 1 liu leader 56134 Dec 10 23:07 query$ query #=============================================================# 登录名 工作证号 姓名 月份 工资 奖金 补助 扣除 总额#------------------------------------------------------------- liang 2074 梁振宇 03 1560 1400 180 90 3050 liang 2074 梁振宇 04 1660 1450 230 70 3270#=============================================================# 注:煤气费不再从工资中扣除,由煤气公司自行收缴$ cat list.txt cannot open list.txt: Permission denied

Page 108: 第 4 章  UNIX 的文件和目录

第 4 章 第 108页

进程实际 UID/ 有效 UID 进程 proc 结构中的 p_uid域和 p_suid域一般情况下,进程的实际 UID 和有效 UID 相等打开文件时,文件系统将根据进程的有效 UID ,与

文件所有者 UID 之间的关系和文件的权限进行访问合法性验证

可执行程序有 SUID 权限后,进程的实际 UID 和有效 UID 可能不再相等,实际 UID 是当前用户用户,而有效 UID 为可执行文件的文件主

SUID 使得用户可以通过文件主提供的程序来访问一个文件主未授予他访问权限的文件,这种访问依赖于文件主提供的程序,进行有限的访问

Page 109: 第 4 章  UNIX 的文件和目录

第 4 章 第 109页

SGID 权限SGID( 设置组 ID) 权限和 SUID 权限类似增加 SGID 权限时,文件必须事先有组执行权限 chmod g+s file-list删除 SGID 权限 chmod g-s file-listSGID 权限的文件在 ls -l 列表时,组执行权限处显

示小写字母 s ,而不是 x (组执行权限处显示大写字母 S ,则不是 SGID 权

限,而是与文件和记录锁定有关 )