本篇索引:
1、引言
2、文件类型
3、获取文件属性的函数,stat、fstat、lstat
4、超级用户(root用户)和普通用户
5、进程与用户ID
6、文件权限的检查
7、新创建的的文件和目录的所有权
8、access函数
9、umask函数
10、chmod、fchmod函数
11、粘住位
12、chown,fchown,lchown函数
13、文件长度
14、文件截断函数
15、文件系统概述
16、link,unlink,remove,rename函数
17、符号连接
18、与符号相关的函数,symlink和readlink函数
19、文件的时间
20、mkdir函数和rmdir函数
21、打开目录,读目录等函数
22、chdir、和getcwd函数
23、自己简单实现ls命令
1、引言
上一章通过学习文件io,知道了如何打开文件、对文件进行读写数据等的操作,那么我们这一章将换一个角度,专门围绕文件属性进行相关的讨论。
2、文件类型
之前说过,在Linux下一切皆是文件。应用层看待底层机制时,一切皆以文件的眼光看待,但是底层的机制之间的毕竟是有所不同,根据这些不同,文件也被分为如下几种。
2.1、普通文件(regular file:符号-),其又分为如下两种
a)、文本文件(ascci二进制文件)
b)、二进制文件(纯二进制文件)
对linux内核而言,这两种文件并无区别,具体如何解释均有应用程序说了算。
2.2、目录文件(director file:符号d):一种特殊的文件,用以包含其它文件的文件名字和指向这些
文件对应i节点的节点编号,目录允许读,那么用户就可以读目录文件,但是只有内核可以写目录 文件。
2.3、字符特殊文件(character special file:符号c):对应字符设备。
2.4、块特殊文件(block special file:符号b):对应块设备(如磁盘等)。
2.5、FIFO(符号p):有名管道文件,用于进程间通信,是一种纯软机制。
2.6、套接口(socket:符号s):用于实现跨机进程间的网络通信,当然也可用于实现本地(本机)
进程间的通信。
2.7、符号连接(symbolic link:符号l):用以指向另外一个文件,类似于windos界面下的快捷图标。
所有的这些文件中,普通文件数量最多,最常见,其次是目录文件。
3、获取文件属性的函数,stat、fstat、lstat
3.1、函数原型
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
3.2、函数功能
获取文件的属性信息,文件的属性信息存在了磁盘上该文件对应的inode(i结点)结点中,但
是open打开文件时又会从磁盘i节点中复制一份到内存v节点中i节点结构中,这三个函数还
是有一些区别的。
a)、stat:利用文件路径名从磁盘上的i节点中读取文件属性到buf结构体中。
b)、fstat:前提是文件已经打开,利用文件描述符直接从v结点中的i结点结构中读出文件的属
性,该函数直接从内存中读,但是stat直接从磁盘读取。
c)、lstat:如果操作的文件是符号连接文件时,直接读取的是符号连接文件的属性信息,而stat
和fstat读的是符号连接文件指向文件的属性。所以我们说stat和fstat是一个符号跟随的函 数,而lstat不是。有关符号跟随的问题后面将再次讲解。
3.4、参数说明
a)、const char *path:文件路径名。
b)、int fd:文件描述符。
c)、struct stat *buf:存放读出的文件属性信息。
3.4.1、struct stat *buf结构体说明
struct stat {
dev_t st_dev; /* 块设备号 */
ino_t st_ino; /* inode结点号 */
mode_t st_mode; /* 文件类型和文件权限*/
nlink_t st_nlink; /* 链接数 */
uid_t st_uid; /* 文件所属用户ID*/
gid_t st_gid; /* 文件所属组ID */
dev_t st_rdev; /* 字符设备ID */
off_t st_size; /* 文件大小 */
blksize_t st_blksize; /* 系统每次按块Io操作时,块的大小(一般是512或1024) */
blkcnt_t st_blocks; /* 块的索引号 */
time_t st_atime; /* 最后一次访问时间,如read*/
time_t st_mtime; /* 最后一次修改时间 */
time_t st_ctime; /* 最后一次状态修改的时间,如权限,所有者的修改 */
};
以上这些结构体成员专门用来存放文件的相关属性,囊括了我们讲的7种文件,但是每种类型的文件都不会全用上这些成员项。比如说块设备文件用了块设备ID st_dev后,就不会使用字符设备ID st_rdev,又如文件的大小只有普通文件和目录才有,其它文件是没有的。
3.4.2、st_uid、st_gid
st_uid:文件所属用户ID
st_gid:文件所属组ID
3.4.3、st_mode
st_mode其实是unsigned short(被typedef为了mode_t)的类型,包含了文件类型、设置位和文件权限,看下图:
这些宏使用起来并不是很方便,我们知道了这些宏实现的原理后,大可自己按照这个方法操作,不必一定要使用这些宏。
如果大家忘记了这些宏的话,可在linux下执行man 2 stat,手册中对这些宏有详细的说明。
3.4.4、ls -al看到的文件权限
7种文件决大部分属性是相同的,但是每种不同的文件都有自己独特的属性,这些属性都是stat函数从磁盘中读到了struct stat结构体中,ls -al的目的就是把struct stat结构体描述共有属性显示出来,我们下面以普通文件为例进行说明。
我们执行ls -al main
3.5、返回值
调用成功,返回0,失败返回-1,errno被设置。
3.6、测试用例
3.6.1、stat和lstat函数
事先在当前路径下touch一个file的普通文件,然后调用stat函数获取文件属性。
void err_fun(const char *file, int line, char *oper, int err_no)
{
fprintf(stderr, "%s %d, %s is fail: %s\n", file, line, oper, strerror(err_no));
exit(-);
} int main(void)
{
int ret = -;
struct stat buf = {}; ret = stat("./file", &buf);// ret = lstat("./file", &buf);
if(ret < ) err_fun(__FILE__, __LINE__, "fstat", errno); /* 打印出结构体的各项信息请自己实现 */
return ;
}
3.6.2、fstat函数
void err_fun(const char *file, int line, char *oper, int err_no){
fprintf(stderr, "%s %d, %s is fail: %s\n", file, line, oper, strerror(err_no));
exit(-);
}
int main(void)
{
int ret = -, fd = -;
struct stat buf = {};
fd = open("./file", O_RDWR);
if(fd < ) err_fun(__FILE__, __LINE__, "open", errno);
ret = fstat(fd, &buf);
if(fd < ) err_fun(__FILE__, __LINE__, "fstat", errno);
return ;
}
3.6.3、ls命令的实现
Linux下的各个命令就是一个可执行文件,例如ls命令就是一个可执行文件,存放在了/bin目录下,我们执行ls -al /bin/ls,显示如下:
-rwxr-xr-x. 1 root root 118580 Dec 8 2011 /bin/ls
我然后在执行file /bin/ls,查看文件类型,如下:
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
ls命令实际上就是调用stat等系统调用的函数读取文件属性并显示出来。
3.7、注意点
a)、注意这三个函数的区别
b)、要清楚st_mode含义和它的一些宏的用法
4、超级用户(root用户)和普通用户
a)、root用户对 / 下所有的文件有读写权限,而我们登陆的linux系统软件的内核代码和一些重
要文件也放在了root下,所以我们并不主张用root权限操作,这可能会修改或删除某些重要文
件导致系统崩溃。
b)、当普通用户登陆成功后,会自动进入家目录下的主目录下(/home/xxxx), 主目录路径记
录在了/etc/passwd中的用户信息中。以我的普通用户linux为例,ls /home/ 看下,结果如下:
linux share smb
家目录/home/存放的是主目录,每个主目录就是每个注册过的用户的合法操作目录,该普通用户在自己的主目录下拥有对所有文件操作的权利。当前普通用户是无法cd进入其它普通用户的主目录,目的是防止你修改或删除其它普通用户私有的文件(添加组ID除外)。
普通用户对/下的文件只有读权限,而没有写权限,目的是为了防止普通用户修改或删除超级用户的/目录下的文件。
在linux用户下试图进入share用户的主目录share是无法成功的,这就防止了linux这个普通用户修改或删除普通用户,同样cd smb也是不行的。但是允许普通用户cd /,只是对于普通用户来说只能读/下的文件,但是无法修改和删除/目录下文件。
5、进程与用户ID
5.1、与一个进程相关的用户ID
不管是执行vi、ls、pwd等命令,还是./a.out执行自己的可执行文件,目的都是为了运行程序,那么与一个进程相关的用户ID都有哪些呢?
1)、实际ID
•实际用户ID
•实际组ID
2)、有效ID
•有效用户ID
•有效组ID
3)、保存ID
•保存有效用户ID
•保存有效组ID
5.2、三种类型ID的区别
5.2.1、实际ID
一般情况下,如果未设置添加组ID的话,用户自己跟自己一组,自己亲自担任组长,用户ID就是自己的组ID。
vi 程序运行时,当前用户是linux的话,进程的实际ID就是linux,ID是我们登录时从/etc/passwd中读出的。即便是我们现在将当前用户切换到了超级用户或其它的普通用户,但是之前运行进程的实际用户ID是不会发生改变的。
实际ID就是看,我们运行该程序的用户的实际用户ID和实际组ID,这个ID取自口令文件/etc/passwd。
5.2.2、有效ID
1)、正常情况
有效组ID由exec函数(保存),正常在没有对可执行文件设置用户ID和设置组ID的情况下,exec保存的有效ID等于实际ID。
2)、特殊情况(设置了用户ID和设置组ID)
初始时exec函数保存有效ID等于实际ID
•如果对可执行文件设置了用户ID的话,exec函数保存的有效用户ID就被修改为可执行
文件的所属用户ID。
•如果对可执行文件设置了组ID的话,exec函数中保存的有效组ID被修改为可执行文件 的所属组ID。
•如果两个设置位都被设置了的话,exec函数保存的有效用户ID和有效组ID都会被修改。
3)、有效ID专门用于文件的权限检查。
5.2.3、保存ID
运行程序时,将exec函数中保存的有效ID保存一个副本。
5.2.4、设置ID
设置文件的用户ID和设置文件的组ID,这在前面已经提到过,目的就是想让进程的实际ID和有效ID发生分离,因为正常情况下,有效ID就是实际ID的复制,但是设置了用户ID和组ID后,exec函数保存的有效用户ID和有效组ID就会被修改为文件的所属用户ID和所属组ID。
密码是用户信息的一部分,它存在了口令文件中,但是用户信息的重要性导致它是不可以被随意更改的,所以它是一个属于超级用户的文件,所以在一般情况下,普通用户是没有办法对其进行修改的,ls -al /etc/passwd,结果如下:
-rw-r--r--. 1 root root 2244 Jan 12 2012 /etc/passwd
看出这个文件的所属用户和所属组都是root,除root外的其它用户对该文件只能读,每个普通用户都有修改自己用户密码的权利,我们常在普通用户下用passwd这个命令进行修改,修改密码就涉及/etc/passwd文件的修改,这就需要用到设置位。
passwd这个命令是一个可执行文件,我们执行这个命令就是为了运行这个程序。实际上shell脚本的作用就是为了逻辑控制shell命令的执行,而每个shell命令其实就是一个可执行文件,每个命令运行起来就是一个程序。
执行命令ls /usr/bin/passwd -al
-rwsr-xr-x. 1 root root 25980 Feb 22 2012 /usr/bin/passwd
这个命令(可执行文件),对于其它普通用户来说只能执行而不能读写,但是被做了用户设置位的设置,所以执行这个程序后,进程的有效用户ID被设置为了root,当它去改写/etc/passwd文件时,这个文件的所属用户ID等于进程的有效用户ID,passwd命令能修改/etc/passwd文件。
6、文件权限的检查
前面多多少少已经讲到了文件权限的检查,本小节将集中讨论文件权限的检查。
文件权限的检查实际上分为两部分:
•文件所属用户ID和所属组ID检查
•文件读写执行权限检查
6.1、文件权限检查的步骤描述
如果是root用户,对文件有无条件的读写权限,但是对于执行权限不是,如果不允许执行,即 便是超级用户也没有办法执行。
a)、检查对文件进行操作的进程的有效用户ID是否等于文件的所属用户ID
•相等:检查文件所属用户对应的存取权限是否允许进程对它的相应存取操作,允许则操作成 功,不允许则相应的操作函数出错返回。
•不相等:执行下一步b
b)、检查对文件进行操作的进程的有效组ID是否等于文件的所属组ID
•相等:检查文件所属组对应的存取权限是否允许进程对它的相应存取操作,允许则操作成功,
不允许则相应的操作函数出错返回。
•不相等:执行下一步c
c)、如果前面的a、b两步都不成立,则直接检查其它用户对应的存取权限是否允许相应的文件存取
操作,允许则操作成功,不允许则相应的文件操作函数出错返回。
以上三步是有优先顺序的,一定是先进行a步的检查,a步不成立才进入b步,b不成立才进入c步
6.2、文件权限检查举例
6.2.1、例子1,vi 命令
阅读本文的同学完全可按照如下步骤操作,我们这里以root用户和普通用户进行说明。
1)、先切换到root用户下
2)、touch file
3)、ls -al file 结果如下
-rw-r--r--. 1 root root 0 Apr 29 11:43 file
文件所属用户可读可写,文件所属组只能读,其它用户只能读
4)、回到普通用户
5)、vi file
vi 命令运行起来后就是一个进程,它去操作file这个文件时也要进行文件权限检查,在没有做设置位设置的情况下(可执行文件vi并未做设置位),vi运行起来后,这个进程的有效用户ID等于实际用户ID,有效组ID等于实际组ID,但都是普通用户ID linux。
a)、检查有效用户ID(linux)是否等文件的所属用户ID(root),结果肯定是不相等
b)、检查有效组ID(linux)是否等文件的所属组ID(root),结果肯定也是不相等
c)、但是其他用户的权限只允许读
6)、我们尝试向file里面写,但是写完后在退出保存时,提示该文件是只读的,不能被写,虽然 加!强制倒是可以,强制退出保存是另一回事。
6.2.2例子2,open函数
这个例子是我们最常见的情况,我们知道open函数在打开文件时,会进行文件权限的检查,我们来看看是如何进行。首先在普通用户下执行touch file。
int main(void){
int fd = -;
fd = open("./file", O_RDONLY);
if(fd < ){
perror("open file is fail");
exit(-);
}
}
我们gcc a.c生成可执行文件a.out,当我们运行这个程序的时候,涉及到两个文件权限的检查,第一个就是./a.out时,会对a.out做文件权限检查,当a.out运行打开file文件时,会对file进行相关的文件权限检查。我们一步一步来看下是如何进行。
1)、./a.out 时的文件权限检查
a.out作为一个文件,它也是被别的进程启动后才运行起来的,这里可能涉及后面的知识,我们这里可以先了解,过程如下。
我们ls -al a.out 结果如下
-rwxrwxr-x. 1 linux linux 4885 Apr 29 12:13 a.out //没有做设置位
正常情况下,这里子进程的实际ID和有效ID全部都为linux。
对a.out的权限检查步骤如下:
a)、检查子进程的有效用户ID是否等于a.out这个文件的所属用户ID,显然这里是等于的, 然后所属用户的用户对应的RWX是允许执行的,所以a.out能够正常执行,因为并未做设 置位,所以a.out进程的有效ID不会被修改。
2)、a.out对file文件操作权限的检查
我们首先 ls -al file,结果如下:
-rw-rw-r--. 1 linux linux 12 Apr 29 11:57 file
我们从上面的一步,已经知道运行起来的a.out进程的实际ID和有效ID都是linux,权限检 查的步骤如下:
a)、查看a.out进程的有效用户ID是否等于file文件的所属用户ID,显然是相等的,并且所 属用户对应的rwx权限允许读写,所以open函数打开成功。
6.2.3、例子3,设置位举例
•未做设置位
1)、切换到root用户,touch file 并ls -al file
-rw-r--r--. 1 root root 0 Apr 29 17:58 file
2)、对文件操作的程序还是6.2.2的a.c,打开的方式任然是O_RDONLY打开,gcc a.c
ls -al a.out 结果如下
-rwxrwxr-x. 1 linux linux 5213 Apr 29 18:36 a.out
3)、./a.out运行起来后,进程的有效用户ID和有效组ID都是linux,操作file文件时,权 限检查步骤如下
a)、a.out进程的有效用户ID不等于文件file的所属用户ID
b)、a.out进程的有效组ID也不等于文件file的所属组ID
c)、其它用户对应的读写执行r--允许读,所以a.out以只读打开成功,不会报错
•做设置位
将上面的file的权限改为如下:
-rw-r-----. 1 root root 0 Apr 29 18:36 file
这时我们要是在运行a.out,发现open函数会报Permission denied的错误,这是因为其它用
户的读写执行权限全部---,所以最终权限检查失败,那么在这样的情况下我们就需要对a.out
做设置位。
情况1、设置所属用户设置位
a)、切换到root用户
b)、chown root a.out 将a.out的所属用户修改为root
c)、chmod u+s a.out 设置a.out的所属用户设置位
d)、返回到普通用户,并且ls -al a.out,结果如下
-rwsrwxr-x. 1 root linux 4853 Apr 29 20:20 a.out
所属用户对应的执行为变为了s
由于做了所属用户设置位的设置,./a.out时,子进程从父进程继承过来的有效用户IDlinux会被exec函数在加载a.out函数时,修改为root,但是有效组ID还是继承过来的linux ID。
当a.out打开file文件时,权限检查步骤如下:
a)、检查进程的有效用户ID是否等于文件的file的所属用户ID,因为锁了设置位a.out进程 的有效用户ID就不再是linux,而是root,所以显然是相等的,并且对应的读写权限还 允许它读,所以打开成功。
情况2、设置所属组设置位
e)、切换到root用户
f)、chown :lniux a.out 将a.out的所属组修改为root
g)、chmod g+s a.out 设置a.out的所属组设置位
h)、返回到普通用户,并且ls -al a.out,结果如下
-rwxrwsr-x. 1 linux root 4853 Apr 29 20:20 a.out
所属组对应的执行位变为了s
由于做了所属组设置位的设置,./a.out时,子进程从父进程继承过来的有效组ID linux会被exec函数在加载a.out函数时,修改为root,但是有效用户ID还是继承过来的linux ID。
当a.out打开file文件时,权限检查步骤如下:
a)、检查进程的有效用户ID是否等于文件的file的所属用户ID,显然进程的有效用户ID 为linux,file文件的所属用户为root,不相等。
b)、检查进程的有效组ID是否等于文件的file的所属组ID,因为设置了设置位,a.out进程
的有效组ID就不再是linux,而是root,而file的所属组ID也是root,所以显然是相等
的,并且对应的读写执行权限还允许它读,所以打开成功。
情况3、都设置
我们当然可以将a.out的所属用户和所属组都进行设置位设置,但是实际上起作用的就一个,我们没有必要全都设置,具体看哪一个起作用,需要具体分析权限的检查,前面讲的passwd命令的设置位和上面的例子讲的设置位是一回事。
6.3、目录权限的检查
7种类型的文件都是有文件权限的,并且权限都是由st_mode来说明,所以目录也不例外。目录文件的作用是用来管理其它文件的,当我们想访问其它文件时就必须要能够通过目录,即便默认的的是当前路径,想要访问当前路径下的文件时,对于当前路径的目录必须有相应的访问权限。
对于目录来说:
1、读权限:允许读取目录的目录项列表。
例如:
mkdir kk //创建一个新目录kk
chmod 375 kk //目录kk的权限变为了d-wxrwxr-x. 2 linux linux 4096 Apr 30 12:05 kk
cd kk //进入目录kk
当我们在kk目录下面执行ls命令时,对kk的权限检查步骤如下:
a)、检查ls进程的有效用户ID linux是否等于目录文件kk的所属用户ID linux,显然是相等,所以ls按照-wx操作,但是ls命令调用的是stat函数需要读当前目录kk目录项列表,获取目录项名字,但目录kk所属用户对应的权限-wx并不允许r操作,所以当我们试图ls时,会提示ls: cannot open directory .: Permission denied,ls失败。
2、写权限:只有内核才有写权限,创建了一个新目录,内核需要写目录文件的目录项列表。
例如:
mkdir kk //创建一个新目录kk
chmod 375 kk //目录kk的权限变为了dr-xrwxr-x. 2 linux linux 4096 Apr 30 12:05 kk
cd kk //进入目录kk
当我们在kk目录下面执行mkdir命令,其进行文件权限检查时,检查步骤如下:
a)、检查mkdir进程的有效用户ID linux是否等于目录文件kk的所属用户ID linux,显然是相等,所以mkdir dir按照r-x操作。创建出新的目录的名字将被添加到kk目录的目录项列表中,但目录kk所属用户对用的权限r-x并不允许w操作,所以当我们试图mkdir dir时,会提示mkdir: cannot create directory `dir': Permission denied,显然操作失败。
3、执行权限:穿过目录时用到,比如希望打开 ./dir_1/dir_2/file,除了对file有相应的存取权限外,
对于目录./、dir_1和dir_2还必须有相应的可执行权限(x)。
例如:
mkdir kk //创建一个新目录kk
chmod 375 kk //目录kk的权限变为了drw-rwxr-x. 2 linux linux 4096 Apr 30 12:05 kk
cd kk //进入目录kk
试图cd kk进入kk目录时,其进行文件权限检查时,检查步骤如下:
a)、检查cd进程的有效用户ID linux是否等于目录kk的所属用户ID linux,显然是相等,所以cd kk按照rw-的要求操作,目录的x位又可称为穿过目录许可权位,可是目录kk所属用户对用的权限并不允许x操作,所以当试图cd kk时,会提示bash: cd: kk: Permission denied,显然cd kk失败。
6.4、对文件权限的总结
1)、root用户拥有超级权限,即便权限是--- --- ---全都不允许读写,但是超级用户能够有无条件 的对其进行读写,这一点普通用户是做不到的。
但是对于执行位来说,所属用户、所属组、其它用户对应的权限中,至少有一个是允许可执行,如果全部都不许执行的话,root是没办法无条件执行,对于可执行位例外。
2)、对于设置位要清楚一点,只有对于可执行文件做设置位才有意义,因为只有可执行文件才 能在执行后变成进程,才会涉及到进程有用户ID有效组ID。对于非可执行文件进行设置位的设 置是没有意义的,但是这里目录除外,目录也会做设置位的设置
3)、普通用户和超级用户之间存在着权限区别,学到现在我们应该清楚,普通用户和超级用 户的权限的区分是通过文件权限的区分来实现的,普通用户之间是不能够相互访问对方的文件 (添加 组ID除外),具体的原因我们现在就能说清楚了。以我的ubuntu为例。
ls /home/ 结果如下:
drwx------. 39 linux linux 4096 Apr 30 14:46 linux
drwx------. 25 smb smb 4096 Feb 18 15:02 smb
Linux是普通用户linux的主目录名称,smb是普通用户smb的主目录,从这两个的目录的文件权限可以看出,除了用户自己和root超级用户意外,其它用户根本无法访问,所以普通用户之间和普通用户与超级用户之间的权限区别就是通过文件权限的区分来实现的。
7、新创建的的文件和目录的所有权
7.1、对于新创建的文件和目录所有权遵循如下规则
1)、新创建的文件(包括目录在内)所属用户ID设置为进程的有效用户ID,
2)、新文件的有效组ID按如下规则:
a)、如果该新文件所在目录的所属组ID未做设置,新文件的所属组ID为进程的有效组ID
b)、如果该新文件所在目录的所属组ID做了设置,新文件的所属组ID为该文件所在目录的所属组ID
7.2、举例
1)、例1
正常情况下vi或touch file,mkidr kk,试想file和kk的所属用户ID和所属组ID是多少呢?
2)、例2
a)、我们自己写一个程序,调用open函数创建一个新文件file,然后我们对生成a.out所属 用户改为root,并且做所属用户的设置位,新文件file的所属用户ID是什么
b)、将a.out所在目录的所属组ID修改为root,并作组设置位,那么这时新创建的文件file 的所属组ID又什么呢?
8、access函数
open函数打开已存在文件时会进行文件权限检查,用的是进程的有效用户ID和有效组ID,但是有的时候当可执行文件被做了设置为以后,往往进程的实际ID和有效ID不再相同,那么我们可能就像验证下实际ID对于文件是否具有相应的存取权限呢,access函数就能够满足这样的功能。
8.1函数原型和所需头文件
#include <unistd.h>
int access(const char *pathname, int mode);
8.2、函数功能:按照实际ID对文件进行相应的存取权限测试
8.3、函数参数
•const char *pathname:文件路径名
•int mode:文件擦开放式说明,mode与如下选择
F_OK:测试文件是否存在
R_OK:测试文件是否允许读
W_OK:测试文件是否允许写
X_OK:测试文件是否允许执行
以上多个选项可用|组合。
8.4、函数返回值:成功返回0,失败返回-1,errno被设置
8.5、测试用例
1)、切换到root用户,然后touch file,ls file -al
-rw-r--r--. 1 root root 0 Apr 30 14:46 file
2)、回到普通用户,编译下面的程序,得到可执行文件a.out
int main(void)
{
int fd = -; fd = access("file", R_OK|W_OK);
if(fd < ) perror("access file is fail\n");
else printf("access file sucess\n"); fd = open("./file", O_RDWR);
if(fd < ) perror("open file is fail\n");
else printf("open file sucess\n"); return ;
}
3)、执行chown root a.out,接着再执行chmod u+s a.out
4)、切回到普通用户,然后ls -al a.out,可以看到我们做了所属用户设置位的设置
-rwsrwxr-x. 1 root linux 5181 Apr 30 14:48 a.out
5)、执行./a.out时涉及到的一系列权限检
•对a.out做文件权限检查
首先某个父进程产生一个子进程,子进程的实际ID和有效ID均继承于父进程,均为我的普通用户linux,然后子进程再进一步运行a.out,运行a.out是权限检查如下:
a)、进程的有效用户ID linux肯定不等于可执行文件a.out的所属用户ID root,执行下 一步。
b)、进程的有效组ID linux肯定等于可执行文件a.out的所属组ID linux,并且对应的 权限允许执行,所以a.out肯定能被成功运行。
但是由于所属用户做了设置位设置,所以a.out进程的有效用户ID从原来的继承过来的linux变为了root,不过有效组ID任然是linux。
•access函数用实际ID对file文件做文件权限检查
由于a.out的实际ID(实际用户ID和实际组ID)都是linux,access检查时只能按照其它用户对应的权限进行检查,而其它用户对应的权限不允许写,所以access对file文件进行写权限测试失败。
•open函数用有效ID对file文件做文件权限检查
从前面知道,a.out进程的有效用户ID变为了root,等于file文件的所述用户ID,并且对应的读写执行权限是允许读和写,所以open file文件成功
所以从这个例子我们看到一个奇怪现象,同样对file进程权限的检查,一个函数的权限测试成功,而另一个失败了,究其原因就是因为一个是用实际ID测试的,另一个是用有效ID测试的,并且通常在做了设置位后,一般来说实际ID和有效ID又会不同,所以才会导致这个现象。
9、umask函数
9.1函数原型和所需头文件
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t mask);
9.2、函数功能:修改文件权限掩码
9.3、函数参数
•mode_t mask:新的文件权限掩码
9.4、函数返回值:此函数调用永远都会成功返回,返回的是修改前的文件权限掩码
9.5、测试用例
int main(void)
{
int fd = -; fd = open("file", O_RDONLY|O_CREAT, );
return ;
}
本意想创建出777(rwxrwxrwx)权限的的file文件,但是实际上这个新创建的file文件的取权限如下,ls -al file:
-rwxrwxr-x. 1 linux linux 0 Apr 30 20:57 file
实际得到的权限是0775(rwxrwxr-x),原因就是权限掩码对指定的权限做了修改,默认的权限掩码是0002(八进制),我们最终得到的文件权限是按照如下规则得到的。
文件最终权限 = (~(文件掩码))& 指定权限
0775 = (~(0002))&(0777)
所以0775是这么得到,当然这个权限掩码是可以被的,比如将其修改为0,
int main(void)
{
int fd = -; printf("%#o\n", umask());
fd = open("file", O_RDONLY|O_CREAT, );
return ;
}
文件权限掩码修被改为了0000,并且返回修改前的文件权限掩码并打印了出来。然后我们再来看看新创建的file文件的权限如下,ls -al file:
-rwxrwxrwx. 1 linux linux 0 Apr 30 20:57 file
达到了我们的目的
9.6、注意点
1)、我们在shell终端执行umask命令,看到默认的文件权限掩码是0002,而我们的程序默认的 0002就是继承自shell终端的0002。每一个进程都有自己的文件权限掩码,所以上面我们修改程序里的权限掩码,并不会修改掉shell的,当我们吧程序的掩码修改为0000,但shell终端(也 是一个运行的进程)任然是0002,不会有任何的改变。
2)、默认的文件权限掩码为什么是0002呢?原因是为了防止新创建出来的文件被用户将修改的 可能,所以将新创建的文件的其它用户对应权限中的w位设定为-,起到保护的作用。一般情况 下,我们不主张将默认0002权限修改为0000,因为这不利于文件的保护。
10、chmod、fchmod函数
10.1函数原型和所需头文件
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
10.2、函数功能:修改文件权限,一个是用文件路径操作,一个是用文件描述符操作
10.3、函数参数
•const char *path:文件路径
•int fd:文件描述符
10.4、函数返回值:调用成功返回0,失败返回-1,errno被设置
10.5、测试用例:略
10.6、注意
1)、我们常见的chmod命令就是这两函数的一个调用界面
2)、chmod命令、chmod函数和fchmod函数想要被合法执行需满足下面的条件
a)、超级用户,无条件执行
b)、如果在普通用户下,进程的有效用户ID等于文件所属用户ID
比如file文件,它的权限如下
-rw-rw-r--. 1 root linux 0 Apr 30 21:33 file
当我们在普通用户执行chmod函数或chmod命令时,因为进程的有效用户ID是普通用户,而不是root,所以在在普通用户相面执行chmod命令或函数失败,报如下错误:
[ linux@bogon xiangtan_1404]$ chmod 777 file
报错chmod: changing permissions of `file': Operation not permitted,权限受限
3)、只有超级用户有权限调用chmod命令或函数设置或修改粘住位
11、粘住位
在早期的unix系统中,如果一个可执行文件的粘住位S_ISVTX做了设置(粘住位st_mode中,前面有提到),那么这个程序第一次执行结束后,这个程序的.text会被保存在交换区,目的是为了下一次执行改程序时,得到快速执行,但是实际上现代unix已经不再需要粘住位这个技术了,我们这里就不再讲解。
12、chown,fchown,lchown函数
12.1函数原型和所需头文件
#include <unistd.h>
int chown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);
12.2、函数功能:修改文件的所属用户ID或所属组ID。
12.3、函数参数
•const char *path:文件路径
•int fd:文件描述符
•uid_t owner:指定所属用户ID
•gid_t group指定所属组ID
12.4、函数返回值:调用成功返回0,失败返回-1,errno被设置。
12.5、测试用例:略
12.6、注意
1)、我们的chown命令是这两个函数的调用界面。
2)、chown用文件路径操作,fchown功能和chown一样,但是它使用文件描述符操作。lchown也利用文件路径操作,不过它可以操作符号连接文件,chown和fchown却不能。
3)、只有超级用户才能执行chown命令或函数
13、文件长度
13.1、st_size
我们前面学习struct stat结构体时,这个结构体中的st_size被用来描述文件长度,但是这一项只对普通文件、目录和符号连接文件有意义。
13.1.1、普通文件
对于普通文件来说,文件长度可以为0,读到文件末尾时会收到文件结束提示。
13.1.2、目录文件
对于目录文件来说,长度一般是16或512等的整数倍。早期目录文件中的每个目录项是固定大小的长度,但是现在是可变的。
13.1.3、符号链接(又称软连接)文件
ln -s file point_file //建立一个符号连接文件point_file,它指向另file的文件。
ls -al ponit_file 结果如下:
lrwxrwxrwx. 1 linux linux May 3 15:21 point_file -> file
上面符号连接文件point_file文件属性中的4指的是file的字符个数(不包括\0),符号连接文件存放的就是它指向文件的文件名称(相对路径)。
13.2、st_blksize、st_blocks
13.2.1、st_blksize
内核中对于一个文件进行io操作时会选择一个比较好的块长度,早期有些是512,有些是1024,而有些是4096。
通过前面的学习指导,标准io为了提高操作的效率,专门开了一个库缓冲,一般说这个库缓冲的大小就设置为st_blksize,虽然我们在第3章第8小节了解到,最佳的标准io库缓冲大小是8092,但是实际上4096已经和8092效率已经没有太大差别,但是所花费的空间却省了一半。
13.2.1、st_blocks:实际分配的块数。
13.2.3、例子
以普通文件为例。
1)、touch file//创建新文件,但是文件中不写任何数据
2)、编译如下代码
int main(void){
struct stat stat_buf = {}; lstat("./point_file", &stat_buf);
printf("st_size = %d\n", stat_buf.st_size);
printf("st_blksize = %d\n", stat_buf.st_blksize);
printf("st_blocks = %d\n", stat_buf.st_blocks);
return ;
}
3)、运行编译出的可执行文件,结果如下:
st_size = 0 //文件没有数据,所以文件大小为0
st_blksize = 4096 //io操作的块大小4096
st_blocks = 0 //块数是0.因为没有数据
4)、向文件中输入hello,然后编译,再运行可执行文件,结果如下:
st_size = 6 //包含\n在内
st_blksize = 4096 //io操作的块大4096
st_blocks = 8 //给了8块
对于这里8块的说明:
blkcnt_t st_blocks
This is the amount of disk space that the file occupies, measured in units of 512-byte blocks.
The number of disk blocks is not strictly proportional to the size of the file, for two reasons: the file system may use some blocks for internal record keeping; and the file may be sparse—it may have “holes” which contain zeros but do not actually take up space on the disk.
13.3、空洞文件
13.3.1、文件中的空洞
int main(void)
{
int fd = -; fd = open("file", O_CREAT|O_RDWR|O_TRUNC, );
if(fd < )
{
perror("open file is fail");
exit(-);
} lseek(fd, , SEEK_SET);
write(fd, "hello", );
}
上面的代码,新创建出来的文件file是空的,但是后面的lseek(fd, 8000, SEEK_SET);将文件读写写指针调到了文件的第8000字节处,然后写入字符串“hello”。
磁盘在为普通文件分配空间时是按照4个磁盘块为一个单位进行的,一个磁盘块大小为1024,4个磁盘块实际存储的字节数如果小于4*1024,直接分配4个磁盘块,如果超过了4*1024的字节数,则再分4个磁盘块。
ls -al file
-rw-rw-r--. 1 linux linux 8005 May 3 16:59 file
文件大小为8005字节的文件file至少需要8个磁盘块,但是我们du file 得到的结果却如下:
4 file //磁盘上分了4块
只分了4个磁盘块,因为实际上只有字符串“hello”才存在了磁盘上,前面的都是空洞。空洞在磁盘上实际是不占空间的,所以这个file文件是我们利用lseek做的一个空洞文件,这个在第三章实际上有讲过。
13.3.2、读空洞文件
执行命令cat file > file1,cat命令底层调用的是read函数。
执行du file file1 结果如下:
4 file
8 file1
明显file1大了很多,原因是read函数在读文件中的空洞时,会把它读成实在的0,所以file中那些空洞一旦被read后,空洞就会被读为实实在在的0,然后写在了磁盘上,这些0实际是要占用空间的。
14、文件截断函数
我们学习open时,知道有这么一个标志:O_TRUNC,它的目的是将打开的文件截断(清空)为0,这一小节我们将要学习有关文件截短的函数,它们能够把文件截短为任意长度,O_TRUNC只是文件截断中的一个特例。
14.1函数原型和所需头文件
#include <unistd.h>
#include <sys/types.h>
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
14.2、函数功能
将文件截断为所需长度,truncate利用文件路径名操作,ftruncate利用文件描述符操作。
14.3、函数参数
•const char *path:文件路径
•int fd:文件描述符
•off_t length:文件被截断为的长度
14.4、函数返回值:调用成功返回0,失败返回-1,errno被设置
14.5、测试用例
我们用truncate也可以做出空洞文件,就是将制定截断的长度大于文件长度的方式进行截断,那么超过的那部分就形成了空洞。比如前面13.3小节的例子,可以用truncate实现为如下:
int main(void)
{
int fd = -;
fd = open("file", O_CREAT|O_RDWR|O_TRUNC, );
if(fd < )
{
perror("open file is fail");
exit(-);
}
ftruncate(fd, );//或则truncate("file", 8000)
write(fd, "hello", );
}
14.6、注意
1)、要求截断的长度length<文件原有长度,截断后的文件中,超过length的内容没有意义,因 为后面的内容就被清掉了。
2)、要求截断的长度length>文件原有长度,超过的部分就会形成空洞,利用这一点可做出空洞
文件。
3)、我们从前面知道,可以利用lseek函数制造空洞文件,但是lseek有个缺点,那就是lseek只 能调动文件的读写指针,但是不能够改写文件内容,所以最后还需要write函数向文件写点数据, 空洞文件最终才能做成,但是truncate函数却不用。
15、文件系统概述
既然我们需要学习文件读写和文件属性等的操作,那么我们就必须要对文件系统有所了解,其实文件系统就是实现对文件进行组织和管理,将所有的文件利用目录这种文件管理容器将所有的文件以树形结构组织起来,方便人们对文件的访问。
文件存放在磁盘上信息包含两部分,一是文件自身的属性信息,二是文件中的数据,对于绝大多数文件来说,只有存有属性信息,而没有具体数据。
15.1、文件系统简单结构图
15.1.1、自举块
自举块也可称为引导块,大小通常为一个磁盘块(1024),起到内核和文件系统启动时的引导作用。
15.1.2、超级块
存放了与整个文件系统管理相关的信息,如文件系统的大小,索引节点表的大小,空闲空间的大小等,我们可以通过ustat系统调用来获取超级块的某些信息。
超级块中包含两个很重要的数据结构,空闲数据块表和空闲inode节点表,专门用于分配和管理数据和inode节点区。
15.1.3、索引节点表(index node list)
索引节点表(inode节点)由若干个磁盘块组成,每个文件在i节点表中都对应一个唯一的索引节点,其中存放了文件的各种属性,这些属性在我们学习stat函数的中的struct stat结构体时都已经做了解到。
我们说7种类型的文件,不管是哪种类型的文件,都对应一个inode节点,但不是所有的文件在磁盘的数据区都存有数据,实际上只有目录和普通文件在数据区才存有真实的数据,其它的文件只在i节点区中存放自己文件属性。
为了访问到数据区存放的数据,inode还存放了很多的指针,这些指针指向了数据区中数据存放的磁盘块,所以我就可以通过inode节点访问到文件在磁盘上具体存放的数了。
但是前提是首先我们要能够找到inode节点,所以为了找到每个inode节点,每个节点实际上都对应了一个inode节点号,目的就是为了索引到inode节点。
一般说每个i 节点的长度是固定的。struct stat结构体中的成员项绝大多数属性都来自i节点,但是文件名字和i节点编号却是来自与目录中的目录项。
15.1.4、数据区
数据区用来存放目录和普通文件对应的数据,文件系统在磁盘上对应的是连续的地址空间,为了效率,数据的存放确是按照块为单位进行操作的,块内数据是连续的,但是块与块之间不见得是一定是连续的,当然读取数据时也是按照块为单位进行的。
数据块的大小一般要适中,因为数据块过大会浪费空间,过小又不能提高效率,一般数据块的大小都定为1024。
目录块中存放目录项列表,这张表说明了在该目下都有哪些文件,每个目录项存放了每个文件的文件名称和该文件唯一对应的i节点编号,文件名用于路径寻访,i节点编号用于索引i节点。数据块中存放的是具体数据,前面也说了是按照块为单位进行存储和访问的。
15.2、文件在文件系统中的具体存放
15.2.1、举例,普通文件在文件系统的存放
1)、存放图示
aaarticlea/png;base64,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bZd3zlSkcyIa9YOxZWGLb/rFXfvKNeOZcs1wXleYgKkQS1Fd/gh3hYm/GW5eZ8nDhtIl3xaXfvEEXDxd/rwn4pkyRu0J+LznfOLoIJLGT5s2Sz61b7gcKmBTcCHW5R8VJmnMtOa1FNvlH5WHrcpRcmzx6RdNwOc35RNHzyVp/LRps+QTTYWheRDgGuk8KFIGCZAACZAACZAACZAACZAACZBAawhQkW5NU7OiJEACJEACJEACJEACJEACJEACeRCgIp0HRcogARIgARIgARIgARIgARIgARJoDQEq0q1palaUBEiABEiABEiABEiABEiABEggDwJUpPOgSBkkQAIkQAIkQAIkQAIkQAIkQAKtIUBFujVNzYqSAAmQAAmQAAmQAAmQAAmQAAnkQYCKdB4UKYMESIAESIAESIAESIAESIAESKA1BKhIt6apWVESIAESIAESIAESIAESIAESIIE8CKRWpFetWpVH/pRBAiRAAiRAAiRAAiRAAiRAAiRAArUikFqRrlUtWVgSIAESIAESIAESIAESIAESIAESyImAtyJNC3ROxCmGBEiABEiABEiABEiABEiABEig1gS8FGkq0bVuYxaeBEiABEiABEiABEjAIDDs+efJhARIgARSExgcl1JXovXvK1eujEvKcBIgARIggW4RuPdepd57z5776NFKLVzYHzZjhlL40JEACZBAiwiM+a//VQ3esUN9uHSp+vDGG9XRT3+6RbVnVUmABLISiFWkoTCLAk3lOStupicBEiCBkggcO6aCh3d8ZlCq166Nj8cYJEACtSEweMg5auf+42rKmKG1KXM3Cnpy1ix1zquvqhH/+I/h5+Nx4/qU6mNLlnSjSMyTBEigRgS8pnZTga5Ri1a4qI+9sk/925uH1PGPflvhUtaoaH/xF0odOFCjArOopRK44w6lJk6Mz/Lv/o7W6HhKjEECtSFw9MRH6t9946/Uw2v3qm37ggE1OieBj6ZOPSPs7L171cif/UxNWLFCTb3yStXz7W8rTv924mNATQngGUGXD4FBpwKXj6hqShk0aFA1C9ayUp03qkfd8d8fDmt97//6RfXBwV71ud//39SosRPVs4/8ndr15saWEcle3bcCEeuCz5eyi6KEhhL4b0G9/iSibrBX/1lEOINIgATqSeCWQJGeMf8q9djffU9t/M0/1bMSBZcai1v+Q/D5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" alt="" />
a)、上图中斜体加下滑线的i节点,代表的是一个普通文件,它的数据存放在了3个 块中, i节点中的数据块指针分别指向了这三个数据块,从图中可以明显的看出这三个数据块不是 连续的,当然也有可能是连续的。
b)、文件真实存放的数据只有一份,并且对应一个唯一的i节点,但是指向这个i节点的却 有两个目录项(file_1和file_2),所以我们就说连接计数等于2。
要删除一个文件,必须等到其连接计数变为0时,各个数据块才被释放,只要还有连接存在,数据块就不会被释放的,那么文件就不会被删除,这就是为什么删除一个目录项的函数名称叫unlink而不是delete的原因了。
我们把上面的这种连接称为硬链接,硬连接的连接计数存放在了stat结构体中st_nlink,另一种连接是符号链接,这两种的区别后面再讲。
c)、目录项中的i节点编号指向的必须是统一文件系统中的i节点,不能够指向跨文件系统
的i节点,因此我们不能创建夸文件系统的硬连接。
d)、我们知道mv命令的作用两个,一个是改文件名字,另一个移动文件,其实这是一回事。
•改名字:比如将file改为file_3,mv隐含的如下步骤:
(1)、建立一个file_3的硬连接,等价于执行命令的ln file file_3
(2)、删除原有名字的连接,等价于执行命令unlink或rm file
一般都是改为当前目录下的什么名字,但是实际上我们完全可以改到其它目录下。
•移动文件:比如mv file到../,mv隐含的步骤如下:
(1)、建立一个../file的硬链接,等价于执行命令的ln file ../file
(2)、删除当前目录下的file硬连接,等价于执行命令unlink或rm ./file
从上面我们可以很清楚看到,修改文件名字和移动文件完全是一回事,都是先建立一个新的硬连接,然后再将原有连接删除,只是改名字的话,新的硬连接往往还是在当前目下,并且名字不同,移动呢,都一般是在不同目录下,但是名字一般不发生变化。
但是不管怎样,实际存放的在数据是不发生更改和移动,所谓的硬连接就是同一个文件可以有很多个不同的名字(多个目录项指向同一文件),但是它们必须属于同一文件系统。
15.2.1、目录文件在文件系统的存放
首先在当前目录kk下创建一个新目录test_dir,mkdir testdir。
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA7cAAAEuCAYAAABVkuWhAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF7svQu0XlV57z0jt3AJuQBJuCXhGpBLEgoCtogBK8g4oBzbAraOxvGBhTE+q6ij1RYOMvCo9aho23Gg4hnljKrA13LkcoqCAiKVi1BIFAzhniCQBAmBAAkQ3N/6rZW599xzr+v7rrXetdb7n2Ps/b7vXHPNy2+uy3zm88xnmhGFxhEwxuSqU5F0aWmTjiXF28qlHU86lhSfq8ExidLy45h/PC7OzdZPH1NkGGXzyfOZlIfNp5fjfrlJeSSl8+P93za/pPik8pLibT5Jx7PiOT8p9HssqW5p+SbVpc74ovWLS+/H+b9te5Li/fZalnk+/XPd31nlJR33y00rY+nSpSPnnntueC9fddVVE5ISZ/O74IILRlauXDmahvg1a9aMfO1rXwvT8OmGrLwnFBYTQf6US/588vvUU08N68p3Qlx74+Jish89P+lY3vik8vLG501n61MHF1tWVj9WdY3U0UaXe96+VjoREAERaAOBSVQyeMgpNIjApEmTctcmq/vIq5c0bh2Szi9ST79Bfp5l5mXLsnlSVlp7/LL9uvl153cerkXS+WWk1ddtX566+nkP4rfbF72U7/eRn4fLwU8bxyiu//zz/DL833H5+mmq/B3XhiLl+X2Sll/aMbfMstP57XH7KIl/3jr4eQ/bb3Eath5Xe0VABERgOAhsPRzNbF8rkwZubkvcgZ7fQn/g6h93f/vCnz2Wpw550qSVXaSsuHzSGPht5HdcetuGJg32bJ+k8U07Fsdq0HH91LfIuWn9mXZfuGXEXSdx19OgmfZTvt/eIoz7Kbefc6lj1n3ahnb0w6Csc8WpLJLKRwREQAREoEkEpLltUm+oLiIgAiIgAiIgAiIgAiIgAiIgAj0RkOa2J2w6SQREQAREQATyEciyBHBzkUY1H1OlEgEREAEREIE4AhJu46goTgREQAREQARKIiCBtSSQykYEREAEREAEMgi8I+O4DouACIiACIiACIiACIiACIiACIhA4wlIuG18F6mCIiACIiACIiACIiACIiACIiACWQQk3GYR0nEREAEREAEREAEREAEREAEREIHGE5Bw2/guUgVFQAREQAREQAREQAREQAREQASyCEi4zSKk4yIgAiIgAiIgAiIgAiIgAiIgAo0nIOG28V2kCoqACIiACIiACIiACIiACIiACGQRkHCbRUjHRUAEREAEREAEGk0gaS/hpPi4xlSVNq4s4oqUl5SH4kVABERABMYT0D63uiJEQAREQAREQARaRwDhMG4P4aT4og3MEj79crLSx5Xv5xGXRnEiIAIiIAL5CUi4zc9KKUVABERABERABBpCAMHWFw793/1WNU54Js+kcpLS91sPnS8CIiACIpCPgMyS83FSKhEQAREQAREQgYYR8IVJ/7df3V60q34e+i0CIiACItBcAtLcNrdvVDMREAEREAEREIEEAr6g6v62Wl1OjUtnheC4Y5yTdDyhKhOikzS7tj5ZQviEDBUhAiIgAiKQi4CE21yYlEgEREAEREAERKBJBOIEUF9odH/HCZz9Hk/iYYVrvz5J6RUvAiIgAiJQDgGZJZfDUbmIgAiIgAiIgAjUTMAVWK1ASRVsvK+ZzVO9Xs6Jy9etjz0eJ2DHnas4ERABERCB3ghIuO2NW+VnXXzxxZWXoQJEQAREQAREoI0EEBLjBMV+NaZ+nrYcK/C6v/MIwXECd1HeGg8UJab0IiACw0xAZsnD3PtquwiIgAiIgAi0kIBv7uv+9o/laZ4VVP1z3d++4JsnX9L0K3DnLUfpREAEREAEjJHmtiFXgWZmG9IRqoYIiIAIiEDrCGRpUZMEU6uJ9YXaMgHYsrPqaMvUeKBM+spLBERg2AhIc9uAHteLrAGdoCqIgAiIgAi0hkCcoOjG5RVWk9IlCaRFy3CFaqvBBXJSuRoPtOYSVEVFQAQaSmBS8IAdaWjdhqJaSS+yiy66aCjar0aKgAiIgAiIQD8EXAHS/W7zjIuLKy8un6Rz4+L9OP93Vn00HojrFcWJgAiIQDECEm6L8aoktX2hSaCtBK8yFQEREAER6CgBBEiCnaePEyjj4uJwlCXc+nWKKyspTuOBJDKKFwEREIF8BLTmNh+nSlNJqK0UrzIXAREQARHoKAGEWmvuGyfE2jgrcObBEJdPnvNsGlunPOf49dJ4IA81pREBERCBZALS3Caz0REREAEREAEREIGGE4jTuFJlX0h1BUl3RZYrAFtB2dUEJzXfX9XlC6pJ58XF+3nFpVGcCIiACIhANgE5lMpmpBQiIAIiIAIiIAINI2CFSVcwtMIpVfUFRl9wtc1x432BOC4f4pIEWb/MhiFTdURABESg8wSkue18F6uBIiACIiACIiACIiACIiACItB9Alpz2/0+VgtFQAREQAREQAREQAREQAREoPMEJNx2vovVQBEQAREQAREQAREQAREQARHoPgEJt93vY7VQBERABERABERABERABERABDpPQMJt57tYDRQBERABERABERABERABERCB7hOQcNv9PlYLRUAEREAEREAEREAEREAERKDzBCTcdr6L1UAREAEREAEREAEREAEREAER6D4BCbfd72O1UAREQAREQAREQAREQAREQAQ6T0DCbee7WA0UAREQAREQAREQAREQAREQge4TkHDb/T5WC0VABERABERABDIIbHxzs9mw8c2MVDosAiIgAiLQZAISbpvcO6qbCIiACIiACIhALQS++m8PmP9+zf0ScGuhrUJEQAREoBoCEm6r4apcRUAEREAEREAEWkJg7frXQ6F289u/M088/3JLaq1qioAIiIAI+AQk3PpE9FsEREAEREAERGCoCDzym5dG2/vE6leGqu1qrAiIgAh0iYCE2y71ptoiAiIgAiIgAiJQiABrbW//5bOj59y9/Hmzcu2GQnkosQiIgAiIQDMISLhtRj+oFiIgAiIgAiIgAjUTwAz5yp8sD02St992azNz2g5hDb730xVae1tzX6g4ERABESiDgITbMigqDxEQAREQAREQgVYRQGP73dtXjK6x/dPF882SEw8Khdx1GzaZK25+2Kx7dVOr2qTKioAIiMCwE5g0EoRhh6D2i4AIiIAIiIAIDA+B5158zXw30M7iSIpwxnsOMEcdMCv8jkMptLkIvwi6CL0H7TV9eOCopSIgAiLQYgISblvceaq6CIiACIiACIhAfgKYId/y4DPmtmXPhCchvC5538Fmv92njssEoffKWx8ZFX4X7rub+eAx+5gp22+bvzClFAEREAERqJ2AhNvakatAERABERABERCBOgmghb3v0TWh4yjW1xLQxqKxTRJYOeeGe58KzyNsvdU7zLsP3t38wSG7mxk7Ta6z+ipLBERABEQgJwEJtzlBKZkIiIAIiIAIiEC7CLBm9p5H1hg8ICOsEhBmTzlq7qgZclaLMFO+9q4nRrW4pD/qwFnmmPmzzdyZU7JO13EREAEREIEaCUi4rRG2ihIBERABERABEaiWAELsQytfDITa1eO29EGoXXz4nqH2FS1s0XDf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EAEREAEREAEREAEREAEREIE6CEi4rYOyyhABERABERABERABERABERABEaiUgITbSvEqcxEQAREQAREQAREQAREQAREQgToISLitg7LKEAEREAEREAEREAEREAEREAERqJSAhNtK8SpzERABERABERABERABERABERCBOghIuK2DssoQAREQAREQAREQAREQAREQARGolICE20rxKnMREAEREAEREAEREAERaAeB9evbUU/VUgSSCEi4TSKjeBEQAREQAREQAREQAREYIgKLFhnzgQ8Yc/XVxmzaNEQNV1M7Q0DCbWe6Ug0RAREQARHoLIFHHuls09QwERCB5hCYN8+YH/3ImLPOMmb33Y057zxj7rmnOfVTTUQgi4CE2yxCOi4CIiACIjAUBDZsfNMsffKFZrb1W9+KRpof+5gx110nlUoze0m1EoHWE0C4tQET5csvN+bYY405+GBjvvIVY1avbn0T1YCOE5Bw2/EO7rV537n5YXPT/SvNuldlk9IrQ50nAiLQHgIr124w//2a+83VP3vMrF3/evMqPn9+NKq88kpjTj/dmOnTo09+a7TZvP5SjUSgpQSSTJExHvn856M5NsyWmWNTqJ7Abze8VX0hHSth0kgQmtKmSZMmNaUqQ12PHafOMOd+/fqQwT/+5QfMG6+/aj78qa+Z7XbYyTzwk381j/zi1vA78QoiIAIi0AUCW2+zrTnrby43W2+znfn3f/qCWfvMY41q1slBbX6YUiOsBq8J/gJrQiMD5hRQOiQCQ0tgWtDyhVta/94tn8GkmZm95e+gAmR40pwf/OlpUwBaoaSMs0/+2N+YeYcebf7l4o+ZdatXFTq/7sQNEidNI4Tb5158zdz2y9+YYw+abfbbfWrd/aHyPAIb39xs7l7+vHl102Zz2tH7hEcv/v4vDCZ7S953sDl07i7mlgdWmVseXGXec+ieYZrNb//OoPmYO3OK2XorGQToohIBEWgfASxVdt5+22Y+w1j0hm1gVjjmGGOuusoY17Yw65yGH6dffvzgM+aUI+eaKUH/KIiACIwn8PTTxvCHGfHSpdGxe++NVi+gcS3LuGNaIB9feqkxS5b03wMPrXzR3P/YWnPaMfuYGTtN7j/DjuXAuPqym34Vjq0//O79zLEHBwugFXIR2DpXqooT3b1idbjOiY6UcFsx7BzZb7/t1uaEBXuPS/ln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" alt="" />
目录kk的目录项列表中包含一个test_dir的目录项,该目录项中存入了test_dir目录文件的名字和该文件对应的i节点的节点编号,该节点编号指向了一个i节点,这个i节点指向了数据区的目录块test_dir。
对于任何一个新创建的目录或者说是空目录而言,其连接计数都是2,比如上面新创建test_dir目录,test_dir所在目录项指向了275的i节点,同时test_dir目录中的. 也指向了275的i节点。任何目录都至少包含两个目录项,它们是.. 和. 。
15.3、如何利用文件路径访问文件
比如我想访问/home/linux/kk/file.txt,访问步骤如下:
1)、找到根目录/在磁盘上的位置,/在磁盘上的位置是固定的,这一点很重要。
2)、查找/下的目录项列表,找到文件名为home的目录项,利用该目录项中的i节点号找到 对应的i节点。
3)、利用i节点中的st_mode判断文件的类型,如果发现也是一个目录,进入到这个i节点指 向在数据区的目录(home目录)。
4)、重复2和3的步骤,穿过目录linux和kk。
5)、直到找到非目录文件file.txt为止。
6)、要读取文件数据时,还需要利用file.txt文件对应的inode节点中指向数据块的指针,访问
到数据区中实际存放数据的数据块。写数据时,如果当前数据块写满,则需要重新分配数据 块 继续写数据。
15.4、为什么要用文件描述符
通过前面的学习我们都知道,希望对文件操作时,必须先用open函数打开文件,然后返回一个文件描述符,最后在用这个文件描述符实现对文件的操作,但是为什么不直接利用文件路径,而一定用文件描述符操作呢?原因如下:
1)、对于文件的操作需要很多额外的描述信息,比如我们希望对文件的操作方式是为只读、只
写、可读可写、阻塞或非阻塞等等,以及文件读写指针,文件长度等,这些都需要相应的临时
数据结构来存放,这就要求预先做好相应的准备。
2)、从上面的15.3我们也看出,我们必须通过i节点才能实现对文件的访问,而这个i节点又是 存在了磁盘上的inode节点区,但是访问磁盘的速度是很慢的,再假如路径有很长的话,本身
还要穿过很多目录文件,访问很多目录文件的i节点时,会更加的减慢访问速度,所以我们如果 实现将文件在磁盘的i节点信息区复制到内存中,下一次要使用i节点时,直接使用内存中的副 本即可,这样访问的速度将会大大的提高,但是如果内存中的i节点被更改了的话,磁盘上的对 用的原i节点数据也会被及时更新。
用文件路径先将文件,就是为了后续操做做好从分的准备,从而实现对文件高效的访问。
16、link,unlink,remove,rename函数
从前面的学习中我们知道,可以有很多个目录项指向一个i节点,换句话说一个文件对应了很多名字,每一个指向就是一个硬连接,所以想要删除文件就必须将其连接计数减为0。
我们也学会了ln命令来时创建新的硬连接,比如已有文件ls -al file,结果如下:
-rw-rw-r--. 1 linux root 0 May 4 16:39 file
执行命令ln file new_file,我们就得到了一个新的文件名字new_file,但是它们都指向同一个文件, 执行命令ls -al file new_file,结果如下:
-rw-rw-r--. 2 linux root 0 May 4 16:39 file
-rw-rw-r--. 2 linux root 0 May 4 16:39 new_file
连接计数就从1变为了2,因为file和new_file都指向了同一个文件,当file和new_file在同一个目录下是,名字不允许相同,如果在不同目录下的话,名字可同也可不同。
我们执行rm file或unlink file,file的连接计数被删除。ls -al new_file,结果如下:
-rw-rw-r--. 1 linux root 0 May 4 16:39 new_file
这时连接计数变为了1,我们实现了将file更名为new_file,模拟了mv命令的改名操作。当然执行mv file new_file会来的更为简洁些,但是隐含的操作和上面却是一样,上面ln命令在创建硬连接时,向下的调用是link函数。
16.1、link函数
16.1.1函数原型和所需头文件
#include <unistd.h>
int link(const char *oldpath, const char *newpath);
16.1.2、函数功能:为文件建立一个新的硬连接。
16.1.3、函数参数
•const char *oldpath:原有路径名
•const char *newpath:新的硬链接的路径名
16.1.4、函数返回值:调用成功返回0,失败返回-1,errno被设置
16.1.5、测试用例:略
16.1.6、注意
1)、如果newpath已经存在了,那么就会出错返回。
2)、只有超级用户才可以建立目录的硬连接,因为可以构成循环,但是这可能会导致无限制的死循环,所以普通用户是不能建立目录的硬连接。
3)、硬连接一旦建立,硬连接计数加1。
16.2、unlink函数
16.2.1函数原型和所需头文件
#include <unistd.h>
int unlink(const char *pathname);
16.2.2、函数功能:解除非目录文件的硬连接。
16.2.3、函数参数
•const char *pathname:需删除目录项的路径名
16.2.4、函数返回值:调用成功返回0,失败返回-1,errno被设置
16.2.5、测试用例:略
16.2.6、注意
1)、每删掉一个硬连接,硬连接计数就减1。
2)、为了解除对文件的硬连接,我们对包含该目录项的目录必须有写许可权(修改目录项 列表)和执行许可权(通过该目录项)。
3)、如果文件的连接计数没有被减为0,那么通过其它的硬连接任然可以访问该文件。 当 计数减为0时,但是还有进程打开了文件并且还没有关闭,那么硬连接计数虽然已经减为 0了,但是文件的内容是不会被删除。
4)、所以想要删除文件必须同时满足下两个条件。
a)、连接计数为0
b)、打开文件的进程数也为0
如果以上两个条件都成立的话,文件的实际内容才会被删除。
4)、如果pathname对应的是一个符号链接文件,unlink操作的是符号连接文件本身,而不是符 号连接文件所指向的文件,因为unlink是符号不跟随的函数。
16.2.7、临时文件
我们写程序时,可能经常需要使用到临时文件,但是如果程序中途崩溃的话这个临时文件可能不会被删除,形成临时文件的垃圾,显然是不好的。
通过前面的叙述知道,虽然文件连接计数被减为了0,但是还有进程正打开着文件并且未关闭,那么这个文件实际的内容是不会被删除,也就是说这个文件还是存在的,例如:
int main(void)
{
int fd = -;
char buf[] = {}; fd = open("temp_file", O_RDWR|O_CREAT|O_TRUNC);
if(fd < )
{
perror("open temp_file is fail");
exit(-);
}
unlink("temp_file"); //立即删除文件
while()
{
write(fd, "hello world", );
lseek(fd, , SEEK_SET);
read(fd, buf, sizeof(buf));
printf("buf = %s\n", buf);
sleep();
lseek(fd, , SEEK_SET);
} return ;
}
在上面的例子中,打开了一个叫temp_file的临时文件后,立即用户unlink函数将其删除,这个临时文件只给当前进程使用,所以它的初始硬连接计数为1,unlink后计数就从1变为了0,但是打开本临时文件的进程还未结束,所以这个文件看起来是被删除了(当前目下是看不到这个文件名字的),但是这个临时文件在磁盘上数据还存在,所以当我们继续利用这个临时文件进行操作,任然是可以的。即便是程序崩溃了,一旦进程结束,那么这个临时文件将不复存在,不会形成垃圾。
16.3、remove函数
16.3.1函数原型和所需头文件
#include <stdio.h>
int remove(const char *pathname);
16.3.2、函数功能:既可以删除目录文件的硬连接,也可以删除非目录文件的硬连接。
16.3.3、函数参数
•const char *pathname:需删除目录项的路径名
16.3.4、函数返回值:调用成功返回0,失败返回-1,errno被设置
16.3.5、测试用例:略
16.3.6、注意
unlink用来删除非目录文件的硬连接(unlink是不能对目录操作),rmdir专门用于删除目录文件的连接,这两个函数都是系统调用,而remove是c提供的库函数,这个函数同时封装了unlink和rmdir这两个系统调用函数。
当检测到是非目录文件时,remove向下调用unlink函数,当检测倒是目录文件时,remove向下调用的是rmdir函数,remove为删除非目录文件和目录文件提供了统一的函数接口。对于目录文件至少都要解除2个硬连接(.和自己的名字),unlink是无法办到的。
Rm命令就是对这个函数的封装。
aaarticlea/png;base64,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" alt="" />
16.4、rename函数
16.4.1函数原型和所需头文件
#include <stdio.h>
int rename(const char *oldpath, const char *newpath);
16.4.2、函数功能:为文件更名。
16.4.3、函数参数
•const char *oldpath:文件旧的路径名
•const char *newpath:文件新的路径名
16.4.4、函数返回值:调用成功返回0,失败返回-1,errno被设置
16.4.5、测试用例:略
16.4.6、注意
更名需要遵守如下规则:
1)、如果oldname指的是一个非目录文件。
a) 、newname已经存在,但是目录文件,rename函数出错返回。
b) 、newname已经存在、但不是目录文件,现将newname对应的目录项删除,然 后再将oldname改为newname。
c) 、对于包含oldname和newname这两个目录项的目录,必须要有写许可权,因为需 要修改这两个目录的目录项列表。
2)、oldname对应的是一个目录文件。
a)、newname已经存在,但是目录文件。
(1)、如果目录为空(只包含. 和.. ),删除该空目录,再将oldname更名为newname。
(2)、如果目录不为空,rename出错返回,出错原因提示目录不为空。
b)、newname已经存在,但是非目录文件,rename出错返回,出错原因提示目录不是目 录文件。
c)、newname的路径前缀中不能包含oldname,如rename(“usr/sys”, “usr/sys/new_name”);
是错误的。
3)、如果oldname = = newname,函数不对文件名和文件内容做任何修改,并且成功返回。
我们知道mv命令有更名功能,但是我们用函数去做和用mv命令去做,在遵守的规则上有些区别,mv也带有很多选项可供选择,这里不在叙述。
如果各位同学觉得上述规则很麻烦,只需记住一点,那就是newname不要指向任何已经存在的文件,可避免上述检查的麻烦。
17、符号连接
17.1、为什么使用符号链接
17.1.1、硬连接的缺点导致引入符号连接
由于硬链接是目录项直接指向i节点,而每个文件系统都有自己独立的i节点区,所以硬连接有如下写限制。
1)、要求连接的目录项和实际的文件(i节点)在同一个文件系统中。
2)、没有办法创建目录的硬连接,因为访问目录时可能会导致死循环。
由于以上硬连接的缺点,所以我么引入符号链接,符号连接实际上是实现对一个文件的间接指向,类似于快捷图标。
17.1.2、硬连接和符号连接的区别图示
1)、硬连接
aaarticlea/png;base64,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" alt="" />
所有的目录项是并列关系,大家都指向同一个inode节点,每个inode唯一的对应一个文件,一个文件拥有多个路径名(多个目录项指向同一个i节点),所有的目录项和i节点必须同属于一个文件系统。
2)、符号链接
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA3AAAAEQCAYAAADxgZakAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF7svQ3QHcV579nY2IABI0QAgYz0YgUkYmyEF2JBgpFIYj5qAbmcBEhuFrHXxFCVvRZV3iDnJispcGO4RWK4yS2wyS2/lHOD2EqWr4oRToJkkw2i7LWkAEayjZGwQSACkixjCczHPv85b7/q91F3T8+cmTkz5/y7aqR3+uPpp39zzpn5T38d8I4Ew0ACJEACw0zgRWnczXLcIcfeiYaOyf/L5Vgycc7/SKBNBO4TZ1bKsWHCqYPl/2vkuF6OGW1ylL6QAAmQAAk0TeAACrimkbM+EiCBxgjslJog3G6Vg8KtMeysqEICPiH3BbG/tMI6aIoESIAESKBTBN7VKW/pLAmQAAmkElglGU+R4yY5IN7G5PiKHM/KsUQOBhLoAoHF4uR6Oe6VY74c+CzP64Lj9JEESIAESKAuAuyBq4ss7ZIACQyGwCap9lo51k5Uj+Fm6LFYMhh3WCsJVEpgrVhbWKlFGiMBEiABEugYgQM75i/dJQESIIE4gdWSvHYiyzL5H3OGpsWLMJUEOkNgYWc8paMkQAIkQAI1EeAQyprA0iwJkMCACGChh8vleFoO9LxRvA3oQrDaRglgaOXpcmDOHAMJkAAJkMBQE+AQyqG+vGwcCZAACZDASBD4vLQS8z0RFspxuxycKzcBhP+RAAmQwHARYA/ccF1PtoYERocAexpG51qzpfkEMFTYrky5Vv7GAj4QdeiZYyABEiABEhgqAhRwQ3U52RgSGAECL0obz5Ljk3LkibgtW/YBufBCY664wpjVmCTHQAJDRgBDhb8oB1asXDDRNvTI4buyacjayuaQAAmQwIgToIAb8Q8Am08CnSJgtwZYJ17H5ratXSvzgWRC0Fny9Lp3ogviRVF+q8TAPfd0qsl0lgQKEZgvuR+TA1tmHCzHBjkwN268kBVmJgESIAESaDEBzoFr8cWhayRAAhMEoMGwNcD4xDkeUu+WIzTHBz1vEHA7dxrz0EPGXHCBbOZ9qzFbtxpz5ZWyn5YYuOMOY+66S/bXkg22ZsyYMMz/SGCICKDnTTqdMxGHsEQOzI2DsBux8DdrNpvde94YsVa3q7lnnHSMOfOkY9vlFL0hgY4SoIDr6IWj2yQwMgTw8ImHUDsMbKn8jdUlfQ+hn5dJP9fLZKBp04xZJ910EGZjY/ujgrA78cSewFu2TOzBIAMJDCEBvPy4Tg55X5EFvPTAyw95hzFK4c/+72+bV3cDBsOgCHzi9FnmEx+dNajqWS8JDBUB7gM3wMu5cuVKs3z58gF6wKpJoOUEpNNsciEG0WTZg6d0pnnDdfKUil42CLc1a2Qe0AJvtiwSAg955DsoX8JwPqaQQNcJ4EUHet3Ol+MqOfAiBPPiMF/umq43rrj/Z558rDny0IOKF2SJ0gSefO4V88Irr5Uuz4IkQAL7E6CA258JY0iABAZN4EVxAA+bqyccgRaTkY5mRsSxyy6TIZbj8qCKJ9WEgGGUGD6JsGGDCEXpvcP5wb6uvQR7zEICbSawWJzD9wiL/8g7jmxI8jfkgLjDy5ERCWf84jFmznFHjEhr29HMHa+9TgHXjktBL4aIABcxafBioseNgQRIIIeAaKls0QUr3tBB9pgcIfGG4ZAI6HF7+mljMCSySMAiJ4sW9VanvOmmIiWZlwS6RQDfIXyXbKfzKvmbq1R26xrSWxIgARIQAhRwDX0MKN4aAs1quk0Aok20lEEPHB42ZZSjWZHTpE9KlwK2CMAqk2UWI0GPG+bAYaGTa67JqYzJJDAEBPCdsi9FNsnf6JFjIAESIAES6AwBDqFs4FK54s39m/PfGoDPKrpDAL0BGDYpHWLZAgsY3TiW4/599xmDLQMgwtATV0bAoQoINyve0CPHYZQ54JnceQILpAUQcRBvl3e+NWwACZAACYwUAQq4Bi43hJoVbhRtDQBnFd0jcKu4jJXyEPBgKSv/J83LWSwTe9bLzsVbtsjqevMmDPTxH7YWwFDn22ViEGwzkMAwExiTxuFgIAESIAES6BQBDqFs6HJRuDUEmtV0jwB63O6acFtGMWbDJqclNGMTxn5JwGIkVYmtzZt7QzFvuy3BAWYhARIgARIgARIggeYJUMA1yJwirkHYrKo7BGT0YzZcctnE/zjPC3bhEezlZoVcXpmUdOwhh20F7OqUKWWYhwSGkYCMTmYgARIgARJoJwEKuHZeF3pFAqNFYEyaK+uIeDfn9pHAvDfMeYOQG0PhigLm0K1Y0dsnDouiMJDAKBIYl0ZjuwEc6CFnIAESIAESaBUBCrhWXQ46QwIkkEQAK0Y++2w9+7ZBFF4lq6mgd2/16iR3mIkEhpIAeuEo4oby0rJRAQKYT20D7gNY5RiLZdntagLFGE0CTROggGuaOOsjgVEmgLf5/b7RR8+YXXESe79VHeyKlhBy999ftXXaI4H2E1giLmIhIQxnxjsMirj2XzN62B+BDRt6+4GeckpvHjSs4T4D8fb5z3Nl4v7osnQNBCjgaoBKkyRAAgECV0j8Ijnkvlg6XHttr3dsfLy0idyC2Bfu7rt7q1HmZmYGEhhCAlhQCHNTrYiTzggGEhhaAhiKj943vLiDaEO49FKZm73MGMyNxos9iLzTT6923vXQAmXD6ibAbQTqJkz7JEACPQKiu8zEfdGslb8XlwCDmytuongzitUn6wrYkqCKbQnq8o92SaAJAhBx8h4j64FbJcc0OWSHDYZ8AgcccIB555138jNGclRhQ5uvw6auo1PnN90k+yBe3ptL/ZB0O+MeY+8tS5bsa4odWo/7D14irsFyyQwkMDgC7IEbHHvWTAKjQ2CFNPWOiebiAbCMeENxvAXF3DfcaOsUcKhr3bre29azzppwnP+RwAgSwHfVijZ8h1eMIAPVZIigvANFkCcU8srbsjEbPtt5dvP88tkc2rhbb+0Nj7zwwp5ww0u70H0F9x6Myli40JivfGVokbBh3SFAAdeda0VPSaCbBMbF7ZUTrssK/eaaPpphV4bEIiZ1h2nS3YC3rRByVW5VULfftE8CVRPAdxbfXQR8l+3LmKrr6ZA99K7FDjQl1gMXK2vTYjZCQk3btTZ88R3CXY+ruI9g6CREGQRaXoDAQ8+bHW6JBU64uEkeNabXRIBDKGsCS7MkQAJC4D457NwZPASu6IMK5idgZUjcbNEDl3LD7aO6bAjlF7/Yq4/DKfshybLDQADf3a1yjMuB4dB43l0iR0vCIxt/ZJ567lVz+CHvNcdPP9QcM+0Qc+RhB5vZxxzeEg/3d6No75prwRWHsOMTi6H4/T3ZF7Nr1y7z9NNPmyeeeMI8+OCD5oEHHohl72YaRBfuH/hdf+wxY7B9TNEA8YYXfLZnrmh55ieBPglQwPUJkMVJgAQCBNZKPBYtQZApBn3PnVm1qmcLvXB1i7cJt83SpfavWv9/Ztsuc/vXnqi1DhrvHoE5xx1hrr3ow+1xHCPH5OuXrUwJEYfn3gva4d6ps48yX/s2FKYxT259ZYpT0w8/2PzkZ29I3AHmKUk75L0HmuOPOnTgjvtEl+tUWYHnlvPZiNV7yy23ZC7ceOONA+dTmwPXXdcbWYGhkGVXMsZCV7Dz2c/W5iYNk0CMAIdQxugwjQRIoByBTVLMLj2OB7wqpgxgNbD163u9YuW8Kl4KE9dxk8bKYxwqU5wfSwwfAaxMuUAO+Wpk3/F17WjiMdPeZyDUfOHV3XvNm2+9LUnvmMc3v+TLUjguNITRxhc2mFPAJ8RiRfSQSXdYZqzcDTfcYHAMbcBweKxgjP8xqqNswPBL6aksLQDL1styJDBBgD1w/CiQAAlUSwAPdhg2KaNUzHw57FLkVdQSmmBehW2fDfT0YUlp3Ojxv7sqmS9/n3EY/vUfFs3t0wqLd53A5ud3GgwJbGWARpIRzAZr++BFDb7r8l4lG1I54DD/g0fncrt0wQcr6X2L9WIBQ0hwheJD6HRvWl692g7KFy2jbQzVOYZNYiEs/J5j9cl+A+ysXGnMlVeapkZs9Osyyw8HAQq44biObAUJtIeA7HmavZWfJkdV4m316t7SzbjhYuhKkwF7AKEnDnPvag7vOfBdBsPmGEabwKs/xVuQFgf73ZaO6UzEYThlFb3sJZoMVk9uecVsfPbfzdbtu4MWrJA56v2DVZoxMdV1sbVShMzy5Xa1m+ClGFwCXsRhvhsWIalqeDxsYi4chvZXZXNwhFhzhwhQwHXoYtFVEmg9AdFZ5tYJL7H0+FhFHj/8cK8XrJ8hL2VdueaasiVZjgSGl4B0ZGTzWtEDJ50QBu9V5Nm4ifDCK69l89w2iGjbvvNnuVViaOVbsmrkrp++npu3yQw+wabjbA9cTPg16XOn68LCIxBadjuAKhqD+8Pmzb3NvquwRxskkEiAAi4RFLORAAnkEJD74uSKk0vkb+ksqyxgeMrs2YObb4A5E48/3puwzhUpK7usNNRxAkvEf3zv8V2vWbxhoR8Its0/3mEwp80NEGhYxORDs6abb/9gu/nW9/bNc0PaNRedau742pOVwi46FNJXOUSZFmxunE7z2RhkXOt73Fw46CXDC0CMpqjyNxzD7G+3GyVKhbDf1CJbg7z4rHvgBCjgBn4J6AAJDAkBrDiJhzn7Zr7KZmHuW9Pz31z/b7utN0xmrsxPq/LmXyUj2iKBQRBYVk+lWHQEvWyYD4ghknveeHNKRVhF8tRZR2XCzV1REvmsgLPibbpsJ1B1yOsRSxV41o6b3yfs8vxvuqcO4q1s2PDDl7Oh4pjz21jA/WPbNllBdXW5bQPyHL3jjt5cOAwh5aiNPFpMr4AABVwFEGmCBEaeAIZNrpUDz0mYC1Pl8xI20r7rLmPOP9+YxYsHgxo9gBBumDvBQAIkUAsBiC+Itqe2vmo2SU9bb+XIfVXhoR+9bKeOHWVComzeB440B777Xdk+cFef/6FmRUJJKranrYiI03lLVl2qmCve3L9T5r9hzuLfrJEhhxLOPPlYs2DujPr36sMKwugZw/y3uu4hGEaJ4Zn33EMBV+pTxUJFCVDAFSXG/CRAAvsT6N2PjcH89QX7J/cVAwGHt5tY9rmum2+eg5ycnkeI6SRQioBdhASbcGOYpBsgxCDIPjR7evZ/So8Nynz81Jlm0UdmZvu9tTnk9ZrFeuLy0nS7rUjM6znU5XznEGpWuKWINtfG7p/9PNvuAcNg0VOKAz2o53zoeHO6rCKK61d5QG/hrfKWEQtgYTuaOsJnPtMb5l/zSsV1uE6b3STQ7l+3bjKl1yQwegQwBeAyORbW0HT0emH1yXPPrcF4AZMQkDiwGuW0aQUKMisJkIBLwC5C8uRzrxj87QaILvSwzZ05LRseWeaB/qIzZL5szSF1iKR2o2jPmRVq1o4rwPLEmBVtKBsTfNrHXbv2CWn8fcQR+6+M64o4XT52PvuYw80f/fYZWQ/ruk0vZj2u+Azc883vmwfWPWvOOuU4s2DescEe1pjtYNratb0k9MDVFTBCg8Pr66JLux4CFHAeKIwiARIoQWBhiTIpRdDrNqieN9e/RYt6Q2Qekk2wsIkrAwmQwP4ENkjUdXLIlCPzxX3J6F1DLxse2H2LkMyVHrb5J/5CZ7bRSBFP+8PpCSkd7wotnYbzIuLLlvfZdMVgyH8tTKdNvKzy5S/a++a2DT2qONADu27TS+axp7dl8xyx/yEOiPcF82ZkefoO62WjQoi4uudR4wUfevswagR7zTGQQI0ERkrAdWrFpBovOk2TQGcIYO4Cbrzohav75psHBfVjFTP4xEACJOAnsFaiccgz7Kbf3WE27vl3s+lHO8zuPW9MyX/MtPdlD+kQbe4iJH6jwx2bItB8AkpTSendc0WcLo/zlHp85crGYS4jekw/cfoJZr0sbvLoUy9kPXIQ+jgw3HLRh2ea+XOOLjckFr/XEKEN7OOZzbHDxt6Yb4f7VhN1lgXPcp0nMFICruzVuv1rT5QtynIk0BoCGJJ03mkntMafJEfwRhN792BZ5j17korUlgk9bwwkQAJBAuhB+e6vv2p+afp0c8irB5rdS98w37pq35L+GD53mgi22CIkQeMtSkgROSl53CYVze/DkWojNZ+vjrriMFT2zJOOzQ5syL5u84vZ/Dj01v79vz5j7n/82WzRk3N+6ThZoOZ96W6cckpv8RLs/Vb3EEcIRcyzwwtHirf0a8ScpQgMtYCrqsdNT6wuRZqFSGDABPAms3MBb09x023TnDOsNFbnXIrOXSQ6PMoEMARus/SwYY82e6889YqjzJL/foo58/891mz7vZ+Zoz8u+7TJvLaURUhGmSXb3iMAoY8DPXMQcY8+tS3rwcUwSxxYjfQsGV45XxY9iQb0guH3GveRplYQ5oJX0UvCxOoIDK2A62ePkhBevP058tCDQsmMJ4FWEnjmxV37re7Wt6PSKWbG5MCqk/LSsbaAuWZtmW+G4ZN4m4sw6N5AD3DfnBebLZbmMZVtLpwXYm/xY/XF0kJ1hsqE4kN23Pg6yvZjM8XntuTZvvNn2fA2iDbfIiQHfupdZs+aN80h3z3QXLL6RGNkgT4GEihKAIIfo0ZwYO+4x2TRE7wksMf9WPREhNxZp8zwvxxAL9jTT/f28Gxyc22smvzww8Zcf72syrygaLOZnwSSCAylgOtnj5IYtTN+8ZjOTLCOtYNpo0Xg6995rloBJ3NbjAzzz4Jsj5YtVlBXaFNvF3rdMLcBAUM76x6OU4KpT3hZoRVL81WVJ9B8ZWwcyjYhZvqpp5+yaKdtXxPtjLFuKg3D2jaKYPMtQoIHbXflyMyn/y6HrPuT/VaslkPexTCQQFkC6G3DgZcHj353W9Yzh165r69/LjuQhq0I0HM3JQxidUjsBYfev9NOo4Are8FZLpfAUAq4fvYoySXGDCQw6gSunQCwWP6vU7yhGvR4YfgLVhEb9CImeIP72GO94ZNNDcdJ/Ky5IiIkKPoVLImuTMnmihw3oaiYzCvr2osJzzJtCJVx6wkxD5XtSjzE2ubnd5ont7ziXYQEKwTixaZ3EZKF0kr8RkDAfV4OCriuXPZW+4n5b586e042vHLDMy+bNU88n82TQw8dDqRjD8DTD33bHPgrZ/dWMMa8tCZ74K6UN5u4X7Vh9eRWX0061w+BoRRwAFJ2j5J+YLIsCQw9ATyMbZhoJYZP1hns3AXU0RbB1IHhMFqoueJCp9V5+WDbihz7fxGho0WePQ+1IWRb29FtjqX7xKAvvy+frqcL51iEZLPsz/Xk1t5y/2++9fYUtyHUINgg3JIWksBvhP3NwP8QdAwkUAEB7BeIPeNwuHvKoYcu21POvG3OXHCJ+dXHvmWmNyne0DZu5l3BFaaJPAJDK+DQ8H72KMkDx3QSGEkCtvdtqbReXjDWGjBkcdu23nDFtixigmExt93WGz6Jt7otCFq4uOextDzXfUIlr4ybHhM12i+fXbe8zq9FnE6P+RHKG4rP8w3pLivNLcbBZ7vpOAxDQw8b9mjDg7AOEGsfmjW93CIk+I24Rg6ZEmTw24FeOOnIZiCBKgmE9pT75q//lvmm+S0z7+GnzK/K8MpK9pRLdRx7weHAPLxBjx5J9Zn5OkVgqAVcp64EnSWBthPAG/QX5cADmMzNbiRAxLVpxUf0CmKfH/QItkTAxQRCLC12/cqWi9ksIpBCdrQ4CgmnOvyHT776Y0Iz1I5Bx6OXAmLt2z/Yvt8iJFjOHfuznTp7usHm2ujp6CugF25cDvx2YC4ce+H6wsnCYQKhPeXwWceBlZh/VbYhwIJ0fX+uw270Um6+uXevwKqUFHB5tJhegkCfv8wlamQREiCBbhK4a8JtPICJrqo93HRTbyWv8883Ztmy2qtLqgBDKJfLE2lbhnQqp61I0kLDzeamafGRxMCTKWYHabbOKgRXXeLM06wpUSls82wMMh2rRUKw4UEWAs4NWIRk3gkTPW0i3ioN+K24QA68AMJvyIAF3P2P/7D+h/dKAXbf2Padze7heeCPnjNn/tlKc+a555qtF39qyp5yD8h+cl/79lZzumwMjg3Ck4YCl7kEUnc2fxsLmTCQQA0EKOBqgEqTJDB0BOzbczQMK082ETZu7K3khRthWwKE24oVbfEm6EdI5FgR4iuoy8Ty+srbOJ+YsyLOppWxrcvo85hPbpr2BWkptqrik+pnFflii5CgNwI9bdhYe7+V+6qo3LWBbQQg4NADh9+SJl4ABdqgtz0IZGN0lwlg6OL4eHb/mC3z0Xx7ymEVSxxIw+qVuXvKFeWBnjfuCVeUGvMXIEABVwAWs5LAyBIYl5bvlcO+TW8CBHre5s5t30peq+UpFA8ImKjeop44t3cLlydFlDRxGW0dWgCl1m3bVbZ8aj1l8mnmlru21ZTvWHQEog2LkGAxEixK4gYsQnLqrKPkYfUX6ut50I3HOXrg8NsB8TYuxzJfpnrjMHRu7xtv1VsJrUcJYAPuRgKG3eP3efbsyepCe8phe4yt2zeb3D3lyjiObWdwr8BWBm2aClCmLSzTOgIUcK27JHSIBFpIwA6fxJv0pkJbV/K6VlZj2LKlNzm9JQLOijVXUPh6mlIvnbXjEyjWRqooCdnwxbs2XeGGv335fXHwL883lw1s5OX3cfOVKWvLZz81zi5Cki33L+JNBzw0z5detrkyRBJzhAYW8NuxUg78lgxAwH381JkDazorbpgAFg7BEQh6TzlsR5C0p1zAXjB60aKegPviF9kbF4TEhLIEKODKkmM5EhgVAmuloZsmGrukwUZjqCIE0uWXN7uHT14TL5DuBGzkbTf1zstfc3qeaMhL97mXJ/5CwilkS8en+KQFkhZ3sXNdn+88r42+Mm2Js4uQYGNt9CC4AYuQZCtHyiIkGCJZ+2INqVCWSEYIOPyWSKeEWZBakPlIoCCBVat6946cbV/0nnLYIBzfLXdPuXMmFj3B96pwwOIlGzYULsYCJJBCgAIuhRLzkMAoE7C9bwsFwlhDILDa40o87UmAYGrT8JPbby8EwfaQYL+iOoIWOm4dVqSUqTdmt4y9qsoUEY+xOq2ITBGTMTtNpWHu1gYRbOhl04uQQKSdOnZUttw/xFuph826GzImFSyUY+3EQQFXN/HRtI97xxVX9NqObWgS7h16T7lvf397JuLwPfv7f30mW/RkPhY9kQ3CC/Vi415R8H4xmheNrS5DgAKuDLU+ysQeFmJpZaqM2Yuloa68dO1PKH8oXpcvcl6FzSpsaJ/rsKnrqOr8W99/Kdvs1BcwT8a+tT/otXebK//2FPNuc4D5xtnPm9e/459D4pZxbcIO0koFOwQm4QZcyn4/hdD7hmGUmNuQE34u85LwEIC3uxedMTvrFWkytFWIlWVg24Pvmw1F2+h+V12RW9RO2TaklvvZ629mnx3MZ3t1t3zmnGAXIYFoa2xuUarjoXx494FRnGOhDIwngT4JQMCh5wv/l7h32D3lLjpztlm3qbfQCV7CPfb0tuxA+oJ5Mxr/He+TCosPIQEKuBZf1DxB4D7AhJoRstHUQ4utJ/XBKKVNaGuoXTYtxMONj9nwlU/xrahNXz2DjnNXaTtr7Qzz7jcOMHve96Z56ISt5s31b1fmXlT0TRfR9+cTXX/feW6yzmiZskKxaIswtBO9g4tlPfR7780tvWP361kevM0d/6ens4fti84Yq3/lv1zP0jOU+VzbMr6yqb8HMQ/d3xZfHb6y9jus67fn+juu8/ls1hm37dXXDA4bMOQL89nwEqD0i5E6Hc6znf++I88C00kgTgDibf36eJ6EVL2n3LpNL2bDld095RbMPdZgZEVwmDK2Ebjwwt48uMTewATXmIUEMgIUcAP4IOiHBLgQeoDIezCJPWCklPX5EkKSZ8+W89nUcTG/Y2moI8+PvPJ5NrSvtl3abp4fIY5tiD/zpGMNDog1vVId/EMc0k69v9db9O8X7TXn/fIHMtdfkAfKWJnU9sWW837h/3vK/OSI6ebN97w31VwwX1T0QSh6QrTMtGm9Erg5lwjPbNtl/vLBjdlD+CULTiw2JKdEfSjS72cVn31rI8WWm8eWTXE99Ttmv6M2v1uHz4atW6dpn9x26rRBnUPwo5cNQyQLDd8alMOslwSGiACGI9v7JQTcus0vmvWy6Al6xDG08uvrf5TtKXfOLx2//0sV3CswXxoBc+EwHYCBBCoiQAFXEcgUM+5DjX4IiqWl2C6bxz7Q2Aci104oLlTGfajS7YNdX1xZv/PK+XzPK2PT3Ye8kM+h+Lw6du3aZZ5++mnzxBNPmAcffNA88MADeUVqTY+9xc+G+j3Rq/6E3z3MnPDRw0r7kicUteE5X/p7M+fLt5rn/pdfMf/wp1PnnFlxqcuEzmNC0bdqX8iOjT/87Q9K7+D9ZrcITPM//mUye0j0+cQuCqFuvM09W97g/uLx9S6vXYUwKWJDCyV9nsfYpus63d8YbcPm9cXruNh5WV9jNsumjR17uLn2og+XLc5yigB6wXfv+Tm5tIDAMdMOMVjav/Jw+uk9sfTQQ5ULJuwZ5+4pt27zS5mQc/eUw/BKCL7JcPfdvUW4IqtiVs6ABkeCAAVcQ5dZP/C7DyaxtIbcm7KMtvYn5IP7oKPL6AevkI264vMewsoKPLecz0ZevbfcckvW5BtvvLGupldrd7mY+4YcMiqln5ArFLXxd/Xm+8z68EmFHmCLCkVUu33XnmwJaR2wp5Ze4Q95MuHmCTGh6MmeRaGObz75vHlchucgvBPKmBgf+/zF0hLNl1puP9V2KJ/rd14b8tJDdRSJj9URSytSh8377neVWPmuTEUjUmbNE89nD9sMgydw2cdPmip0qnLJ9ngdjMmW9QS9pxwWPcHLuN6ecrvN17611Zx58rGyQfhx5vCO9roVfVFaD+luWj3y8IMaGS1BAdfA50OLG3uOm71Ogzu+uJCbPhERypsS79ZdxI8820VsVd2mKn2DrdBDWorfN9xwQ+ZOZwTcEnFrpgCbAAAgAElEQVQWR9MBK3dh7xwsFFIgFBaKBWxPZpXJ8W/81m+bt95+x2z7n39n3jlo34MCFix5Ti3rjiGnsZ4+DNE5ccb7sweAfctylHGMZUiABEhgxAk8+2xv2GLOFgJVUQrtKffIxh8ZHPOPPNCctW61mfPyVmO+8pWqqq3dDl5I3v61iSE4tdc2XBV84vRZ5hMfnVV7oyjgakccfuBH1SExkOJWalktnrTQSLWT4pO27Z7rtFC9oXhbv7aTFx/yW/uWV6+2o7nqdJ73SQBvUBNWeeyzluLFZV7De//l0azcB80eY45zhstIHFYpcwNW/PQJOLt0Nd7Sbt+5JxNwDCQwEgRWSytvkwM9+19ovsXoHbnsnJOar5g1ZqIA84BrC1h5ssTqk/36E9xTbsebZsPcXzfHTPuROUdWscRnr5XbfPQLgOUbJ0AB1zBy+9AfEiHWHTfdCou8MrGmuGLDFSpaxMCGL87ajokcn6DxxcX87CetqG/91NV02ZWy6uHy5RjPOCLhuut68xiuv77yeQx9E4SwtNfCLmhSwCiWf1/04ZlTbuQQcAwkMDIEsK4DRBxGDg9AwI0M51Fr6Pi4MXfJ6sVXXikjR5YMpPX77Sn31I/Nhh/vMtuPPaG/PeUG0hpjcL/6o98+Y0C1d6va2l9OKBwUcA1+PnyizFd9SPT4BEoor89uXpy2n2rbtkuXz6uvznSf7zqujX7XyaRTtlfL0x3mMuBG3MawYkWyV3YbAUx+P+dDxxsMuWEggZEmsHCi9bIwn8F01/qmK4005pFr/ObNslH82l4P3IAEnMt8ck+5n+4N7il3xknH8J4wch/UahpMAVcNx1wrVjxY0WALaFGRa6hAhqpta3uuALJ/6/bBXV8c4kOCL5S/QNMz29pfN06nFbHdRN6R63HTUD/zGWOwTD/29GljuOkmefCUJ088JIyNRT2cJcINKwl2ZrPlaGuYSAIVEMDXWlZYN/IVN+vkWFiBTZoggY99rDc6omX3jek/2GQukuMTp8wz6w/DBuFT95TDdgTYUw7DK2tZmZOfjKEkQAHXwGWNiQWf0Eh1KSaarI1Y3W49IdGk4117PgHmxum69XmonT67Kb5qe9aO24YyvG35PL90/WXPId4GHraIB3i4GpR+Wrp04AiiDnzpS70FVrA0dI6A03PionaZSAKjQmCBNBTDKDfIIV8jBhLom8DixcbgaFvAlADpGTxQFjE5c8n8bPXN2J5yC+bOyLYrYCCBGAEKuBiditLqevDPs5sqmNBMn60i5TWqfspqW/2cWz+KiDidt5/6i5Z1xZv7d+Pz3+R+Y+6TY5kcg5ijYocoJvRwFWVcSX6scAbhVmIOXCX10wgJdJ0AXg5BwGGbkpa/r+k66pHx/9Zbe7/LeLHWpt9mLKqiVsVM3VPudBlyz0VPRuYTXKihFHCFcNWT2See6qlpqlVXqFRdn+3pgt0yvV79+pPXaxbzKS9N+2ZFYhXXEULNCrfGRZvbsJ0TJ1MXWNRNr+/c9kIm9HDV50TEMjZnZSABEihPwP622N+a8pZYkgR6BG6TpU2x9cyaNdKru7A9VCL3i9Q95RbMO7aRvcXaA42e5BEYqV1CWzE0Le+KNJTuig78XYeYg6BxhVxqHdaf0P8hRG5+W3coL+Ktb77254kxy8+1E6vLTdu1a98Syu7fNs9AhZt1YsvEH9NSW1VxPtx82/YWteIm0hwJjDQB+9uyZaQpsPFVEsCoiLa+9EtoJxa4+vT5HzJ/+KmPmrNOOc5gRcvde97I9pP7s3u+bf5mzWZuN5PAcVSysAeuRVfaFQVl3HLLx2zpNCtWEI9gz/NEDPJqW67f2p7N79bh5rd/59Vr7eqyvnIx/6wfeXl0Pb78VgzmtU37Pm1imIf2feAiDivDIYzp1jd0jjeobQ6LFvVWO8PGrC1Y7azNqOgbCXgJjE3E2t8abyZGkkABAm29b9xxhzHXXttblGv9+twGBfeU++HLZoMcSD/nl44z8+ccnYk8htEkMNQ9cF3rcbMiQD/Mp340bXmfwHBthOwj3rUBO75D23Lrc/Nbezp/anuqyJfCNMTDrV+3y+dbih3LRP/vszfQOOzPhMDlvQd6GYpWrl8QoLwvrqjdtub3tc0Xl+d/mTJ5NpmeQ8D+ttjfmpzsTCaBzhKwG4tjZeUCwe4phx459MzZLWi27/xZtqcceuXwP84ZRo/A0Er3toq3vIf8vPS8j2i/5WG/qA03f0rZWJ5Ymm17Sh6XU9H8PsapNlLz+epoTZz7QCVzrxsPmMNw4om9ap99NneVx8b9Q4UJb3ofe3qbDH/5eZJ7fIuahImZhomA+9uC35xB/NYME89Rb8t99xnzyU/27he4b7QpYFgn7hl9bG8wuafcmdiG4CXzre+9lA2vxH0GB9K5p1ybLnr9vgylgGvNSn71Xz/WQALVE3BfEg76oSpnif7qG1+dxZ+/9bb5+vrncg1OP/xgs/isD+bmy8vg9oTn5e1ieqiXzBev41JerOgyYJRSrossW+Gz+9uC35xB/9a0AgqdKE3A9m61afVJ2xj4BBFXQZh+2MHmojNmm0+cfoJZL8Mpy+4p980nn8+GYnKbmwouyoBMDOUQSnf+EP62x4AYs1oS6BYBd/jkIIZQQrTJcN7saGvARt6YBzc+HvTwbJmEnrcpK5aH/t2Fc81BB747aCclwYoP/G8Pt5wb70vXdfjEjM7Tz3kZ+xBT+oAPqXF5/mo7FG95xPpMx28Lh1H2CZHFJwlgLjLuGZiX3MaAveBwz8AIkwoC7h3YT+7/uPi07MAm4Ih7dfdeg43B/4sMr7zn0e9n+835wrrNL5nxf3ravPDKa75kxnWAwFAKOHAf+CIQHbj4dJEEvARsDxzfiHvxZJGbN/cWMYncjHEzXfSRmWEbkoI3qVVt2OoKEFsphFIZYVKneCkj3qIQa0jsgo81NLt5k/Y3ptjUoOb9ZI3dIdDHMMVaG4mXfbKZd1UCzvUV95DLzjnJLP+dX87uKRjV8aaMAMEwy798cKP5i/vWm299/6UsDmHTj3dk8+ZwPv7PT5tXf7q31qbTeD0EhnIIpUVFEVfPh4ZWh5yAfZiSUR8DCS9KF+AVV/SqTphrNhAfzz/fmNmzo8Ni8Gbzhy/+JOjeqbOPMh8/NS7wgoU7nABxWJVA8glNX5zG5atfx1nxq8vyvEIC9jeGAq5CqN0xhTlcCHkjFZJahFERDz9szJVXtnNlYBkNZjDMs8ZpAZhLfd5pJ2THk1tfyYZXQqzhXnTPN79vHlj3bLY9wQuv/HQSKXrs0BP3n6QXr8oNw//kT/4kq+OGG25IunxlM23fvt088sgj5m//9m/NAw88UNZMJ8sNtYDr5BWh0yQwaAL2ZdygBNxecQBvKhEg5uwKXoPm4tZ/+eVBb3CzxNw33EBDAW9IL/v4SaHkSuKHVYBooRWDFRNzsbQi7DDnmi8LY1chkjaIIdoRd5jULIFHn9qW7XEG4XH8UYfKaIT3myMPfW82N2vOcUcUc8aOijj33GLlmsq9dGlTNWX14AUhDvSurfm3582GZ142e954M+OtA+5Z2GNuya+fopNaf/7pT3/aPPjgg633sw4HKeDqoEqbJNBlAla4bRlQIzDhG28rEQ5u6RMehsNg+OTixZMri/mEGx5CFn3kA9nbT/u22c57q3rlSS1srEApIkbsFddl7Lmtwyd+YmmwG0t3fffZtn7hf52ufXXb4Jbj3y0kIO9nstDSr3kLiQ2VS3b5ewiLZ7btyg434EXXMUccYmYdfXgm8LCAB/73hksvzR0V4S3XVOSGDb0euHnzGn0pCWafOnuOufRjJ2ZDKjE/Drx1wAvHBx5/1lwi+aoIdfe8WR/R6+beP6rwvSs2KOC6cqXoJwk0RcDOSxnUsHgIuBUrmmptuXruuqvXSyjDYV444aT9etywsheEm32LjLlwuDkiVDnvzXXeFTZaEIVEjq/x+mZoz10b2l4sDXXodLfemC2ff4OOY49bhVfgs2JLRpWZBRXapKnOEECPD15sbd+5Rxbb+Il5+Sd7s0U4rJDD3zgwDNANmPOFXrojDz0o+409Ztoh5nC8TMPR1oBFTDCyBIusYMGVhkO26IksdPL19fv3wFlXsDLl0e8/OBtmydB+AhRwBa7R/Y//kLveF+DFrO0gsOOnrxdzxAo4+3a8WOlqclsBhxtdjXMGSjsrE+XxFvMbz79u/kkmiNuAISufOH3Wfm+JsSIlhrHgwWNQ8960UAq1HULQFXH2XPd82fLars4fSnfrd+sL+VV1fJk627q/aNVsGrO3tLGaWFHDBFJfdGD+Gw49ZBK9c9t37cnmb73w6mvZ37bHDisrTq6uOPHze6B5x8x+faeZOetYc/ScEzKBh9/bKud19YXQLq4ywCkB2HbAjgQJteV+edF4pPR8vkcEH0O7CVDAFbg+XG61ACxm7S4BdzgT3o5Lh1jjQeYVZQF757RMwOHt8Nd/4383z5z6qUksIeFmM+Ah4tIFJ5q50jM3iKBF2SB8iNUZEoexMv2mxer0iTvuL9ovcZYngXQCEGA48NvqBvz+Yl7Xy7v2Zr126L2DKHnTHGCeOehI88xLsjDKS89MFnGHYaKn7pgj3rffC7Z0r/rI+cUv9lG4mqKPPvVCriGsTPmPMof71+afkJs3lEEvLKLPV61aJeuUXWEuvvhi81d/9Vdm1qxZk6a+973vma9+9avmxhtvNNdcc425TnouTz755ClVPffcc+YLX/iCueOOO8wGDE0NhI0bNxospoI5crfccov5vd/7PXPMMccEchuT+tIhaKDhBAq4BOB4o85AAl0nEJw7oBs25kQMSsDZTU9btClrJtzkxubO08gTbi7a+R88WpNu9DwmWBp1pObKdI+frzrNIqUMFiqxIo6LlvioMm6UCTT18Iueujlm6gInGA3xwp/+V7N1516z45zzzPbDj8odhon7IcQc5tjB5pGHH5TNsRvWAEanzpKFTeQ4/JD3ZOLYBl/b9XzEIlz0wiLu+bp168zlsgjY2WefLQs5zzYzZ840t99+e2Yewmzu3Lnmsccey1av/PM///PsfLMsUGNFHMTgH/zBH2TiD7/jsOcLEILzpdfzpZdeypKPPfZY84Mf/GCyLl+ZrsVRwCVcsU98lAIuAROzDBMB9LpBvGEY5dgAGtai7QN8wm3Ff77cHPbS88bAz6PasXKXr9eoiSuXOmTSiibrZ0g0heJT26L90eWsfbceXUafWxuuiNN2eU4Co0pg0EOLsSDUnBv/SITd1IAhl6/KFILnZMglhmGi586OpMqGZtpNrO0wTBkpgWGXM486zEyT1TDxf2XDMK+6yhgsfoUFugYwxxuMmnqW1QuLuOcLFvQmvNpeN/SiWQH3MLaBkGDzQKR97nOfy3rk7KIo2DIAPWp//dd/PSWv/u6hDAKEmw1uXYhr6qWD9q2qcwq4qkjSDgkME4GHpDHz5RjeF5K5V8sn3NCLdp4sTnLYje/JLd90BrdXySfmfMLF56MWWHnnsGEFj/1b29XpPvFky7jt0HZSz1NsaJGWd27rZu9b6lUY3nzu9yvls9b1/LiSoTa0eWixHYaJRaXcgPlz23f9zOzY/bp55sVd+4ZhyvBB/O7r3ifM0cPwyzkzegumHCk9dRB2DNUS+P3f//0pBm2vG4ZTWgGH/d4QYkMhkY4yCKHv56BfOmTO9Rko4PoEyOIkMJQEBr0q3ImylDGW6R/Ail1YTnnNv/143yR5ucBYves3Tj9h3xCbZ3srSrb12vtuWlqghHzXZfPOrR2dT9t303Vefa7LVnXuCseqbNLOaBGwQsZ+n/I+U13Pj6sba0NrhhbbewZGRdgh+IGPJsSXFmDZMEzpkXteNrnGapjovYPQw5wwzLHDoYWdOwxzVrYy5iHhYZjXX9/bZLxlc7oDiFobXXTPNwy51GKvzS8dioCngCtCi3lJgASaIYCbHARcgwHCDXPc3MWK9hNuDfpTpKpUAZSar0jdXcqr21/0vEttbb2vK8RDrFW0UA555mboLoFhGFqcDcPE/Dq1gTiGXWKhFAzDzFbClJ477zBM5/L1tjZ4X7YkP4ZhQugdgv3fcDAECfzxH/9x1nOG+WvuwiVf/vKXJ8tgYRMMhcR8OQzDhEDzBWvr/vvvN1dffbXZtWtXtogJhnO25qWDz/ECcRRwBWAxKwmQQEMEGpwDV0q4LVrUA3H33Y1uytoQ/U5Vo0VYp5wfZWe3TjR+0L39Ba+B2/OGonmfv67nt21EL5zbE6exDXxoMUZFYEGLikUSFjbB4RuGuWNC3GEYJrbrwZ51CN5hmOYtc8xLz5k5h73bHHnhr2ULqOheQM101M4htCDg7Jw3u0DJ+eefP4niyiuvzATcnXfemQ2r3LkTk/V74dprr52cT/ebv/mbmS0My7RDM+/G/XoiDMNLBwq4ycvJP0iABEaJQCnhBkDoGcSGrAwkQALlCdiv0MfKmxhUyTzRpv3qen60p2gbNINGzicWyGiiLt8wTAy3xLBLDMPc+dob2f+TwzDNu83uY0802QYH3/z+pIvZPD1ZCfP46YcaDMOcfthBU1aIbKItVdfhzpd0/0Y9dsixzoPPF3rUsOLkF2XLBaSjFw3n7jYDWODkn//5n82tt95qLrnkkmwxEyx28ju/8zvmvPPOm2zKaaedNpkPwy7Ri4fVL90w8JcOfYKngOsTIIuTAAnUQOCmm4zBilR487ZsWaUVaOGGPdpOn3P01DlusRqxESvm5kHIDXBT1piLTCOBVhPAS3P5+mRh4cT//I8E+iEg+4qZF2XZZOy3ZjfN7sdeibK4l4SGYe549HHzzNNbzfajZ5od035hco51tmG5HLgvucEOwzxSVsOcfcz7e8MwZZhnVeGRjT8yHz91Zi0bnaeI/VAeDJ3EqpR2ZUpfeyHUXLGGYZG+oPP58nQ5rrpPQ5cp0HcSIIH9CayVKBwY4nTB/sm1xuyVoSjo5apwH7hvff8lWZzk+exmiYCb7dmnHGcWfWSm7Ivz3vTmHCxLcy5Zkp6fOUmABKYSWDtxiilB2LKEgQT6JYDhk3ip5gyp69dkVeWzYZgXnmvmXDjVIubSYU5dNsfu5d4cu9gwTMzTw3w6CLqjj+gN7dRz9lJ9/vr6H5lv/+Bls+TX5nW+xy+1zcOWjwJu2K4o20MCVRG4SwyNy7FUjqYF3OLFvVbkrCaW0lQIt3+Um5W9MZYWbrayDRuMue8+Y+DjgN70prSbeUigtQS+MeFZx+a/tZYnHTPms5/tibe2rvK4aVOvhxD+TfgIMYbDDXYYJl40YjVMDMOE0MMqmTh88+vcYZi9lTEPiYoy2EY9+P8v7ttgPvUrc8yZJ+3bL40fp24QoIDrxnWilyTQPIHTJqpc23zVmTDqUxxVLtwshtWrsQOoMRs3GnPvvQOAwypJoOME5B1IFs7teDvofnsILMWbxhaHm29O2sg7NAwT2xigpw4Cbsdrr09uc4AWh4ZhYp4exB1Ww0SvHbY5wGgTbGpuA4TcPTInb/OPd2ZCDr18DN0gwCvVjetEL0mgeQILJ6qUF4dGRjQ2uqk3hlCuWtUbErNiRaG21ybcrBcY1omewY91cPWFQiSZmQRqIIDfEhntlgV5T8NAApUQwMgIDLvHb3OfL/8q8UcbmTu351vJHkIILxx6yCR657DVAf7HMMxXZTVMO00AC6jgcAME2iEH7f/ov+GHL2fC7j8snLtfr6BuCs/bQWD/q9gOv+gFCZDAoAng4Uq0itkpBx64FjboECajX3VVr0LZ9yVlsRAt3HCjOkvmuJ3zoeOKzXHLayb8wcFAAiRQnAB63yDi8NtCAVecH0v4CVx3XU/AYYGpNgo4LMZV8YJcAGGHYZ46+6gpXNBTByG3Q1bD3Lr9J1OGYWIopi8g/397cKO59GMnRodg+soyrnkCFHDNM2eNJNAdAgvEVRkx2LiAw+qOCfPfMPzjX5/eZv7lu9sm57hBuJ3zoePNOaceX89wELzpbeMDQnc+VfR0lAnY3reFowyBba+cgP1N5srAGVrfaph2GObfrNls8Lcv4J769//6jPnF4/CGhaHNBCjgBnh1Vso8mq7vQzFAfKy6CQIYJQgBd48c8gKxsYCVHiObeVvhhlUl7Y2oduFmG//JT/aGdmJTULWvTGN8WBEJdJUAFkdCsHNsB9AOLAzx9e88N4CaWSU2vK4lYPuANodFi/b1EA5oFWMMwcQcu5B4s/iwafn0ww82P9iG4TcMbSVAAdfWK0O/SKANBC4XJ2S9DoNhT3hzjh65JgOGUiJMvFUdqHCz7VY+NYmDdZFApwngNwS/JQj4bRlQwHwhHAwkMGoEsBCKDhB280440sydOc3MFfGGl6EYgonRLQztJUAB1+C1YY9bg7BZVTUE5okZiDY8eOHNeZMC7kLZNAcrPn7hC+bN//MPs5vJQHrcNMk9cgPEfkMV7lGnq+A5CQwlAdv7ht8R/LY0HD40a7o58tCDGq6V1fkIzJx+mC+6fBzmTI+PGxnWZEzBha/KV1qgpNzHDBbnmjeAD77j5gvS+4yA1Skxbw7fCaxWydA9AhRwDV0ziDcGEugkgSvFawi4cTkwSuXghlox0ev2/HefMX99z7cnh33gbSEWJsECJQNb8nhsrBYIP3/z7ezNJ8NoE3h5lzzoDVtAk8YnGvWZwTQOD6x6sYfBeMJaR47AgibffobpYm7cH112hsHm4gzdJkABF7l+WKmnimEWd90lrx0POjKr6f+66b9N1njl7y/lw1qEP5OqI2D3fyllcYmUkgW+spXjVsmB85oDvnvfufh/M2sX/K7ZcaDcaGTCNYTboo/MNGeLcMM4/oEEuwccJszffnvlLmBuwu1fe6JyuzRIAgMngN8O/IbgufHygXtDB4aNwPXXG3OlvG2s6eVa37iuuKK3kTfm6g1wESz0vDEMBwEKuMh1hHir5GHq6I96a6nEttcyI0lgKoHLPn6SOfOkY8thsQ9c41IcQ6CWlDOTUgrC7dEnXzCPPvWCaLb3GHPge9oh3KzzmzZJb6R0R2KRFQYSIIF0Al+ayLpE/ufXJ50bc6YRwNDEAQ9PjDqKfU0Rdo7uwiAHHHCAeeedd6Zg8sVFOTqJ/ZRNraPN+Sjg2nx16BsJtIUAhjyNy7FWDtEwVc9fmSrcenvUnPDTV8yV//NmM+37Txvz7LPGDKrXzb0Gixf35r5VPP8Nw1pu+Y+/2parTT9IoHoCl4rJF+XAkGwGEqiawH33GXPbbb3erbatSIm5b5ibhzDA3reqkddhrwpRVoWNOtpWtU0KuASiWE71j377jISczEIC7SKAXt5K5lRh+L684MzEG3rhZD52FcEn3PYNlTzbHLhMxlrh5oeerzbMIcDwnAEtAV0Fb9oggYERWCY142AggToI4D6xdm1vgam2CTiM2Gjjwip1XIcJmxBRvuCL13FFBJgua+ssYsPnZxfiKOC6cJXoIwm0gQDenH9ejnE5+hRwPuGGFyWLPjzTnHnysfvmuGHlLoimtgyNufZaY2bPNmbpUg6jbMNnkj6QAAmQAAjgBR96uSoeHVEJXKxaDHGJ+1gbXkRW0qi4ET1UErl9osoXF7c8NdVXT5HyXc5LAdflq0ffSaBJAkukspVyYBjUrXKIhikasEgHtgLAlgDY0w0Bwu03Tj/BP0cPQqktAb2Ad9zR8+aaayjg2nJd6AcJkAAJ4EVfW3u5MG8a2xxg+OT69bxWJFAJAQq4SjDSCAmMAIEZ0kbRLQYapuA87MLCzeLEm0vs7YMhKMsGPP4KPkBQYiPvNr7lHYGPIJtIAiRAAkEC6OXCgd/pNv1Gw5eFC4Nuj0qCr7fMF9cPj3579Pqpu+myFHBNE2d9JNBlApiHLas1G4i5hFBauFnbGzZIr590+2FPuEELOLzhbdvcioRrwCwkQAIkMBIELrywN2f6ggvaNVQR/uAYsRCanxbDEBN0PnuhuJidWP1dSqOA69LVoq8kMGgC8iIxJfQt3GwlmC+AN5fnnptSbb15ICaxBDTfpNbLmdaHg4B0VBt5ns7my47es+twXMOutQKrBGOEBLd5acWVC4moUC+ZT4zphoRs2nwh29oOzlfKy+HldnVQX4aWx1HAtfwC0T0S6BIBn3A7/qhDzTkfOt4/xy2vceh5W7MmL1cz6ZjDABF3992yEfHlzdTJWkigqwRuFsfl62Jk3R8jO4G0Ze837O/65NZXukp1aPw+59TjzSHvrfgRFL/NbQyLFvWGdmJRrkGPJGkjH/pUikDF355SPrAQCZBAxwm8+tO95h/X/8h863svTbYEwu0Tp88yp84+qr/W4Y0qFhDBW9VBruBl3+q2ZUXM/qiyNAnURwDC7dYJ81+U/+Wr25bw/Ks/NV9f/1xb3BlZP844+ZjqBZyliftFm36ncQ9DwAtJhoER6HqPmwZHAaeJ8JwESCCZQK3CzXpxs7zKv1WeBjE85t57k32rPONjj/WGUHJ4TuVoaXDICGC1WoT5csjXto0BvT94ycTQLIFK9iUNuYxtXrBSMPbq/MpXQrmaj8fKk1iJsgWiEqNkHn1qm1kw71gz/bAWvVlJvCopwyx9piDehi1QwA3bFWV7SKABAla4bfrWDnPpPSeaV8/da/ac/WY1PW7af8x/w015kMIJq2FiEZM2rWymOfGcBNpAYLU4cd+EI+h9a2mAeLv2og+31Lvhdetz/+Nf6mvcscf2bNser/pqKmYZ966WzJ0+8N3vMo9s/FF2zPvAkeaMk47JRskgvgshZQ6cbocr3ty/uzz/DW2kgNNXmuckQAJBArrHbcnfnGJOXX+UmffTI83Bfyo/J3W80EPP2549QZ8aScD8N7xBxVtdzn9rBDkr6SCBveLzdRN+o+dtYQfbQJe7SwA9b21bgRIv/3D/QO/b7bcPnK0773DTj3cYHCMu6fMAACAASURBVIibP+doc84vHWeOmfa+xn1MWXjEzaPzu+cQeDodQs0Kt66LNvfidENyN/5xqr7CWLdvLK2MJzF7sTTUlZeu/QnlD8Xr8kXOq7BZhQ3tcx02dR2DPodwu+fR75s/u+fbk/Pc5hx3hHnfX7wnE20Hf1fE2+dr9nKvPB0O4s0q6oV4w/+cw1DzRab5ThPAb8AmOfAiB1uOMJBAkwQwSmKQ86R9bcXCV9ib7j7bLe3L1Gzc9MOnvmnd88ab5rGnt5n/+vffMX/54Ebzre+/ZN56++3GnPKJrljlNr/Nk3eOfMMk3Gy72QMX+5QMKA2CINZNnCIYQjbcD3qsjn6bXvQLmdIm+BRql01L8Ttmw1c+xbeiNn31tDEOK7Zhwr+7ahuEGxYnwf9ZwDLheOt+qxzny3FBL7rSfz8vT4Y33dRbwQsreTUZMPwFPYC4Cbft4aBJDqyLBGIEMHQSvwEI+IrOj2VmGgnUROCTnzQGvV4YLTG/BR9C3DOwf2jDw+9x74YwQ9i6/Sfmzbfeyf5+5sVd5ic/eyMIf+v23ZJ/tznowHcH89SREHserer5athEHAVcHZ/EgE2fELAfWp2W94Ht58Ou31YE3J2MzvPFZtRtQLyOi/kdS7O2Ynliaa6PoXzaV1tG50/lkce1zelJws02YKn88bAceICTkSJG5munbvSdzGDu3F5WiKhBhZbMYRhU81kvCQQJvCgp+O4j4AUOfhMYSGAQBNDjBQGHlSjbIOAwamNp/18ILD6yfWdvKoH7947XXjev7pbRIRKQjrR+A+aHLjh5hvl/HnumX1MsXyMBCrga4VrT7gO/fviPpdXpmhUlPtESiguVsfmRrtuHNvji6mqbz/fUulyhFvI5FJ9Xx/bt27Mu/DtkMY6LL77YXH311dn/bQuFhJvrPBb8Ol0OPMhdIUfVW7dhHhxuxoO4IZ91Vu/tKTb8ZA9c2z6y9KcNBCDe8N2XZ1WD3wIGEhgUAfxOt2jRkGwFZfiDudOqFw49XW++1RuqaFfnfPPtd7IeMwT0oOGe3E84/JD3yry2QzITGDp55KEHmSefe8VrF3PhFn1kpjnvtBNMnauF6pfiee3z5ddxeed5dXQxnQKu5qumH/hdkRNLq9mtSfMpokX7Eivjtk+Xa+Jcf4l1nWUFnlvOZyOv3scff1zmL98uowBvMrfccou55JJLzAMPPNAaEVdauFnA9sHtQolYK4fcsyp9C48b3yDE286dvflvaCceDBhIgASmErhDTtH7jnC3HPgtYCCBQRHAQiYDCpgrvmP361nt23f+zOzeLT1ma54w22fMMruny272hx2WCSc7tLGsm3b6wntk5chZRx+emTnw3QeY2ce8P/s7ZYsMLQyxEuWnfmWOgeBj6AYBCrgar5MWaPY8JHJ0/phrPhERy5+X5tZdxI8idlPy5uWpMr1oO0MiLe9aPPLII5NC7Ygjjsh632688UZz5513DlzA4Q3gmn/78ZQ5bvghX/SRD8jNoHdjSGZuh05BvGExgwUTR7KBnIyr5SkRc+Eg5tZU3cUXqBt1YQ8fTEBn71sAEqNHlsAmablddRLvNxaOLAk2vC0E8NINvV6vi5CqYL607Yn6ufSUPSf3S4S9P3/LPP/KT7O/d+/5eSbWguGSibHFu9+SzLu82bKescMOytKwCuThB8viYBIwlNGuGon7cVVL/R/83n3z21DfJR87MdtSgKFbBCjgarxeoQd+VBlLy3MptawWKFpopNrJ8wfp2rZ7rtNC9Ybibf3aTl58yG/tW1692o7mqtP1+XnnnTclatasWdn5gw8+qLM2do6bEhYncYdJQLhhcZK+NrfF4gVr5dggh50PJ6NHKgkYhoL5DfgfN+mmJoUPauhmJdBohARqIrBX7GK4NP7Hy5plNdVDsyRQhADmv9lNm+1wSqd81jMmogsBImzvGyKsJDz38m4DkYbgDm3MIgoGCC37AjTrDZve2zD+8EPeM7lMv/t3QfN9Z3//+96bicHz5EXtead9oDJh2LdjNFCIAAVcIVzlM9uH/pAIsZbddCss8srEvHLFhitUtIiBDV+ctR0TOT5B44uL+dlPWlHf+qmryrJf/vKXc81h75IqV06qTbjZlkCsYRgV5sPh7TxEHM6rCFhEBKt5YT5cE+INIhHz3y67rLf65SA3Eq+CH22QQJUErhVjeFEzTQ58x6t6UVOlj7Q19ATceWLZ329PN+Y//anZfdwHzPavy7DFAw80O366b6GPskCynjERYAgzjzrMHPyeXi/WLOkZw1BGhMmVmW0lWEgF942x3kvbsnVXXQ4+/+FvftRMP4xf2qrZNmmPAq4B2j5R5qs2JHp8AiWU12c3L07bT7Vt26XL59VXZ7rPdx03aL83btyYITj//PPrRLGf7W8++bx54PFnJ+Mr6XHbrxaJmCeH6CyDB7xVcsyVY4UvY4m4ClbzSq4VwyZxA/7Sl8T/qhqQXDszkkB7Cci7jUy8IWDRkrGJv/kfCVRAILYEPsxj4Q/0kgXDRxb1kl4OLwDizhPLFvo4orfQx5GHHzQpbLD4R19zwjDkH/cRDOVc1p4uagq34CenUwkUcDVfLiserGiw1eF8hTwUVtm74tquUlTFBJBtl24ffPHFIT7kWyh/kUsE29pfN06nFbFdVd6/+7u/M3fffbexQyldu1X3uLm2T59ztPnat7dmY937HiqZB+MaybBZjlvlWCnHDDkQ12/AZtrXyaQb3BQxN63OjbUvuKDX44c6GUiABPYRQK8bpqHiBc1igokRqOKeU4UN7WMdNnUdsfNHn3whm0tW5RL47jyxOW+KwEPv1y/8wmTPmDu0MeZbZWn23jEPbzUZSKBaAhRw1fKcYi32A2lFRRkBZ4VOTPDE6nadDNnQ8a49nwBz43Td+jyE3Gc3xVdtz9px2+ATdrqcPrfl8/zS5WLn69aty5Ivx5LCKkC81RnwJvE/X3ZGf28UiziIXji8qR+XA71xEHH9Puzhhoy94F58UR4e5emxzh65ivbvKYKMeUmgMwQg4q7pjLe1OKrvk6FKYvfAKmz46k2xG/PLZ7PKuO8887J5bW9vLlrIrm8JfOR1e8bchT4m7WDEBO6nmL+MF32DCg891LtXcfj9oK7AUNdLAVfj5dUP/lX1rmi7uglFfpR9toqU76duXbbKc9sG9yaWJ+J03ir9gS3sBfcP//AP5oYbbtjPtCve3L/LCPz9jDsRfQ0HiRkOpd0uCaK1smXGseABRnBCyPUTrr++V9ojgvsxO6WsbPdgNksX4mc/O5jtCyprCA2RAAnUScB3D3Xry7uf5pWHrZgN977l1qvtxmzUySdkG/PFZsi8MgSsioh5ZQgpS+CHbE7GY740BFwbhFOdo0RyQTDDMBOggBvg1cUQykGE0A9+Fb5YkQRbeYKpivq0Dds2ffOy+WI+5aX56kKZUF1ufoi3r371q1PEG+bCYWNv7A8HoWaFW9WiTfvd6Ll0mJl75cCUhM/I0a94g/N17/ODYS+33dZ7c3raaRRwjX5gWBkJjB6Bfu7J7v0nJNJC8YMk/b/+8lh9i2hgy5c9sgfbIAUchvpjlAheArZo/tsgrznrrpYABVy1PL3Wmupd8VauIt0f8jyxk2LPl8feUKz91JtH2ZuYWy5FTFmhZn13y+SVd9ti7eSV2bVrl/n0pz+dbRvwuc99bgoybOZtgyvifFw7GwcR91jF3m/Z0tsTDouMVD1EBjd9rHZ5//0yRGzEx4hVfNloroME5KuW7fWGxUowbJKhcgJ595Aq7o0+G3n1Vt7Qpgy6wg33iEHMQbND/QcpIpvizXoGQoACrgHseDC3vW2+3pVUgRNy1S0fs6XT7I+3/WG35yk/6tqW65u2hzRfnG5PXr3WRkq5mH8onyq+dLu0j9aOtal9w/ktt9wS3PNt7lws0bgv+D4fPpsjH4ebIhYyQW8ZbpQYMlNlwPDMOodoVukrbZFAXQQwh/VCOeQZOJvPioVLGKYQCN2X6sKUd2/T9ep7lk1v2m/tV+3n6P26Qsbt496wZgAfXNSJexPm4TGQQA0EeptX1GCYJtMJlBETrnVbPu+HPfRDjnjXBuz4Dl+d1qab39rT+dOJ9J8zhWmIh1u7bpfPszw7mPNmmej/Tz75ZJ9JxuURwLwC9JLhJlmleMNNf5GM98SNl4EERpkABBuGPkO8oecN81kZ9iOgf9P1+X4FJiJ899hQHIrYNPt3yG4oHuVHKti5Zxs29F70Nd147FWKPUvHxpqumfWNCAEKuIYuNH7UY70reSIgz01708jLF0vXNx59rsu6Prt5dT57HmtjLC2lvK/OFJu+cm5cSruQv4q68nwZyvQ7pFV4QCwTMLzRijesSllFwLwFiLeHH67CGm2QQDcJbBG3ZQ/7yY260YExr5tNaavX+v6q7zWx9LrvN5izvUpeZl1yySUZPvwNAYjz5557Lhdp3Ssq5zqADJgHd69MwN6xo/m5cNfKssuf/KQs3rU6yVVmIoEyBDiEsgw1liEBEuifwLiYwPYCeLuPB8QyI02wLQNulhhKiblw/c43eEwm6918s5G3Lf23jxZIoIsEpMMiGzaJdyLS0W1kJfRS380utn1APkMcaVGm42wPms5Xh8t2zjZsY+sbbHtz9tlnm9mzZ5uZM2dmC2+1PuBegB6wQQQM78dLxUsvHUTtrHNECLAHbkQuNJtJAq0jsFA8GpNjpxx421/mZSWGp+BGiUVNJvbYE0vFA8rvFEdgDw8n/QrB4h6wBAkMngC+gxg2CfGGHjcsPlTmxcrgW9KYB6Fhj+6QxzxnIMr0EEc3zoq5JsQbfHUX11qAniwJs2bNyv7Hysk6tKLHTTuFcyxgcpbcXE480ZdaXxx6/rBH6aAEZH0to+UWEWAPXIsuBl0hgZEiMCatlU6z7IHRvvXHSndLClDAPIe775aeAvm/7Epj6L27ULocIOBw4514YCngBbOSQPcJjEsT0CMuX4dMtKFXfFr3m1V3C/JElRZmIX+sHTe/FXF5dbg2m+ypQ72tFW9wDvcF+2IPc+GaWlAE95AhuY/8/M23zTPbdoU+tox3COx5481GeVDANYqblZEACUwhgAdEvOWX6QJZD9xVcuDt/7ICnOw8OAgwrDr2hS8Uu1Hb3jeUx8RzBhIYNQI3SYM/P9HoC+R/eY9hZAQaQ7MEbE9bERGn8zbpcZu2SPK2G7/nGFEBMdWUeMPct3PP7e1XOgT3k9173jC3f+0JL15GDpYABdxg+bN2EiABPChing3E27gceJDcKkfRaRZYgASTxjGkMnVvOIg39Nxh7pv9W6pmIIGRIYBetzsmWrtE/kcvOEOjBPJ6zWI9cXlpuiFVDsd09y6NLdKmfWj0vMm9PNHbh/lvODq+Dc0h7z3QzDnuiEYv1bBUduThBzXSFAq4RjCzEhIggVwCeHCcLcdKOfBAKR1imYhL7RRDzxtWkMT2AnkBvW14UwrRBvGGuW84GEhgVAjg+4WXJvKsmQWs27Ni4m/+l0wgdYikNli058ydEwdb7rDKvCGWVrTZcu659qvouSviipZtLP9N0sX8pS/Jywm5yVS57YxuAIZs4j60Vd5A2m0MdJ6OnB9/1KHm2os+3BFvR9NNLmIymtedrSaBdhJYIW7ZHoBV8jcWN5GXmkkBN8ynn+7doDGvDfu54cBEdgS76Tf+xyIliEdvXT+LnyQ5xkwk0DIC+E6dLocVb/jOrWiZjx1xB+IpdoSa4ZaxefLEoBVqeYLNrdMn1qwYDNXnxtu/fXG2ntb2vlkHv/GN3su6u+4KXY5q4vEScNmy3rDNaizSCgkECbAHLohmXwIncSZAYpZWEmh6Um0lEJaIFRnVmM2Lg/YSDWbkpaZZmmDdrh6JISzojcO5nYcAMQexhh43zIlATx1uuEMy2TyBDrOQgDzICgS8GEGQdx7mbjkWTpzzv4ESsMIqJtBiadZ5V2yF8tu6fA32lfHF+cq2Mu6zn903L60uBzF8//77jUFdZRfUqss32h1KAhRwCZeVkzgTIDELCVRJQPSVkc40I2uSZIubyPQ287AceNhMGVKJ+Qe4iWLlMTuUxfbE4X+Ito7PUagSN22NEIExaStehshXI/s+QcQxlCKQImpS8riVF83vczzVRmo+Xx2dirvgAmNw1Bk+L5O3cb/BS8OUYfx1+kLbI0GAQyhH4jKzkSTQQQIQaljcBL1vCBByp8iB4V8pAauOLVnSy4lhk2vWYOLIvrgUG8xDAsNIAN8p+TpQvA3jxWWbvAQw7/laWbHndIwdrjjg/oKeN7wYxP8MJNAAAfbARSBjBZ5b/uOvRnIwiQRIoHYCy6SGhXJgSOWLcmDVvPUFa8Vb0aaWkS7oGrOTQOME5OvAQAIjR2B8vDcXGv/bl3tVQMD9BfaqtFmFX7Qx1ATYAzfUl5eNI4EhISAvNrMhlYvlwLAvBhIggTgBvOwYj2dhKgmMDAHMhV4uS61iJcoqhRaGTWJ+NeZcM5BAgwTYA9cgbFZFAiTQBwEMqby3j/IsSgKjQmBcGor9FCHixuRYOCoNZztJIEIAK0TagCGVVWy0vXJlT7zBVp1bFESaxaTRJMAeuNG87mw1CQwfAbkfM5DASBOQzoBshcmr5IB4mycHh0uO9EeCjVcEsHUM9gA98cTeNjL9AkKv3mIZGoL/GUigQQIUcA3CZlUkQAI1EcDDqtyPs/lxFHI1QabZ1hLAZx4rtWJ9hnVyQLRhoRLMFcXwYwYSIIEeAfSUYdgjeuCw9H/ZgPIQg5hbfa8MDeEc67IkWa4kAQ6hLAmOxUiABFpEYFx8wUPsHXKskuOLcixpkX90hQTqIjAuhu1wSdRxgRzYmHtGXRUOh13skfnMtl3D0Ri2Ip0AFhy5e2IidT97gF4l3dyY93b77dySJp0+c1ZIgAKuQpg0RQIkMCACmNowTw70wKE3DkPIviSH3FuNvCBlIIGhIyCdCNnnHT1uCGNy4PMOAceQS+CFV14zt3/tidx8zDCEBFzhhq0FLrus2Pw19LzZXrwq5tENIWI2qX4CHEJZP2PWQAIk0ASBxVLJs3JAzMlL1uzBFkPK0DuB3jkGEhgGAvgs6+GSmH6DVVop3obhCrMNTRHA5tt3yLCNK67obS+QUi/E2wzp3n7ssd6KlnVvEJ7iE/OMJIED3pEwki1no0mABIaXwCZpGh5y7RQHDCe7Xo5r5IC4YyCBrhHYKw7Ls6a5WQ55hswCBBt63cYmzvkfCZBAOgHMY8PG3th8e+nSeDls1n2d3FTuu0/mlsrkUog4BhIYIAH2wA0Q/kosP8tAAiRQPYF5YvKhiWNM/scDLwQdFjq5VQ48DDOQQBcI4LOKzyw+u/gM47OMZ0dsqYHP+JgcDCRAAsUJYPgjxJgVbxBo2NNt3bp9tjZt6i14ghiIN/TA4X8GEhgwAQq4AV8AVk8CJFAjAfRQYGgZFjXBQy+FXI2waboWAvL8OEW44bOMocKLa6mNRklgtAjYOWxYkORWeVOC/yHSELDdwCmn9FarxOInX5ClXbEAyjXXjBYjtraVBCjgGrws7HFrEDarIgFLQO67ZqkceOilkOPnomsE5ovDeF60wg2fZXymGUiABKojgE24bW8c9nVDQO+b+/+SJVxxskck+u8BBxxgcKSGKvIXtZHqWx35qvKVq1DWcXU8NinePFAYRQJNErBCDg/Dd8hh5xJhWNqYHOzRaPJqsK4iBDDPjYEESKBeAtjLzd3P7SuyH8fYGOe71UvdYCkOK2rqXJajiKjUTdZ+pdjSZbRN2HDz+GzGbHARE020hvOQeFu+HEuHMZAACQyEAOYWQcg9LAfmEjGQwCAIbJFKseXFuBwyHYf7tw3iIrBOEiCBPAI+gYEyWmTYfDoeeUM2YnX7RI62HaszZjuUlmcvlp6SFqpXtyuUL2MpmbkKZYxQRWlWxFG0VQSUZkigCQIYQTOviYpYx8gRWC0tvkuOVU7Ll8nfMs2GgQRIYHgJhERM1Y/jbj1V28bVCQmVUHysTMrVjnELpcFumbbH2uC2I+a3r96Q3VB8zD7nwMXoVJhG4VYhTJoigSYIoIdOFiSbXLlyZxOVso6hJoDP0E0Tn6kL5X8r3sbkb8xx46CMob78bBwJgAAe7HdiC4OJgL99D/v90qrDps8niA/3sHl8cbq8zaPjY+dol9s2V/zYtFjbtb8pfob8cevTfuky1k8dX/acPXBlybEcCZDAcBNYJ807y2ki5tBdLsdn5Fgw3E1n6yomgM8ShklCsOHFgA34PF0pxwVOHP8kARIYCQKu8KirwVXWoW3pc9uGUDzSfWll47Qg0qLNZzfVh1BZ3cbYdQv5gzKhNB0fs08BF6PDNBIggdEm8KI0f1yO2+TA3zbMkz8+KwcewKc58fyTBCwBCLVxOfDZ2eRgmSF/L5EDLwLGnHj+SQIkMFIE8kRCFTCqrsO1F7Idikd7XNHlihVdxpcvJY/LTOe3ab54HafP+70WbntgSwu1MvVxCGW/V4XlSYAEhpcAHraXybFNDtn+Z7KnBA/k18pxnBxXyKF7ViSKYUQJ3CftvkoOfDbwGbHiDb1s+Azhs4R5bmNyMJAACZDABAE8xNtj48aN5pJLLsnO8bcNu3btMqtWrZrMh78R50t/5JFH9mPrK79fpkiEFR6u4LA+R4p5k7SoQSYdp4WOzePmQ56yPngd80Ra+2X/h0ktWF1btkqffY87WRR74EJkGE8CJEACPgJbJBK9KuNyuPPiDpZzPKRfKge2JGDPnEAYoYDPwolyuJ8J9raN0AeATSWBYgSsCNEP9rCyYcMGc9ppp2XC5OKLLzYPPPBAZhyi7sEHH8zSEebLtgd56chn68grnxlNCNp391ynueZC+ULxobKI1/XknVtbOl+KrRgSn71Q/lDeUHzITuazXFSuQhkjxDQSIAES8BHAEDn0ttw/8T/O3QAxh2GW+J9hNAicLs3cMnHNIeQvH41ms5UkQALFCfge2nVc0+cprbA+2by2B0yX9ckLtz0pf7s2U1mgjOuT9kP779Zh8+q6dNtCvut8+jxkNxSvy0/hQQEXw8M0EiABEkgkYMXcaslv58thyBwf4hMBtjzbFvEP13irHFgx0hcwXBLzIxlIgARIIIeA76Fdx9V1rl3TIken2/OQcAnFazu+fMiTIpzyWMCOz75um7ajy/nOU9uh86XUnVKftpuVoYDzYWEcCZAACfRBYJ2UvUcOzHXC0Eod8KCPY6EcHGqp6bTjHCIc1/EbcqyVozdiqXc9d8i577q2w3N6QQIk0AECZYSELlP03A6h1MIiFVdefbCj81jbOl6fx8r60nzl3XbkpcfanFfWTc/Lm+JTERvWHhcxiV1BppEACZBAGQILpBB6aUIP+ask7ZNyHCkHht1hsQvEQTQwDIbAlolrgGtxihxYhATX6FY5rHibL39fL4ceLitRDCRAAiSQSkAvPJJaDvPdELCwiV3cxMYh3k1ftw5voKaGq6++OouwC5zAxp133qmzec/LiAyvoYlIiEhXSKbaRz6bN2a/aFqqXbfuOvxI9Zs9cKmkmI8ESIAEqiJwkxjCvmBbPAbnSdxCOT428f+YJw+j+ieAHlA839geti0ek2C/UI5zJ/7HOQMJkAAJ9EEg9aEf4sbNi3MIv4ceeshccQWWP5aFbe++21x44YXmiCOOyM7ddCx0gkVObLBiCYugoCfOlr/88vxx/qniCjZDeVPbPemw84fLwrbDV4+uo2hPY155Xae+Pj7f3ThtPy8/0kNtoIBLocc8JEACJFAHgS1idK0cj0/8D1Ghw5hEoEdv7sT/M+T/ffdknZvneQTQqwbh5uvtHJP4hXJQsOVRZDoJkAAJTCGgxUmZ3rUYUi2eQnlT8xUtH7Or265tx0Snzpt6TgGXSor5SIAESKBuAhAVa+WwvUI+QWd9wPy6ZXU71DH74IXjYDkuCPiOpf63TKSNyf8L5aBgC8BiNAmQAAmkE4iJnHQrzJlCgAIuhRLzkAAJkMAgCFhBB1GCXjr8v2XCkdvl/2sCTmEj6dlyoKcOi6Sg125eIG/XosEAXHbKgblpWBUSceuchiyWv+91zt0/xydOFsr/Y4E8jCYBEiABEiCBFhOggGvxxaFrJEACJLAfgb0SA7FixZnOADGDRThCYYEkoIdqTA6IPISFE/9D5EHsDTLA/1UTDmyW/yHWbJtT/IJghYD7Skpm5iEBEiABEiCB7hGggKv5mrE7uWbANE8CJDCVwBY5vVkOCCH8jaNMeFYKjXkKrpY42IdQOs2TbqNekj/gQyisCSRcJ/G3BtLcaCs2IWRtb2NI1CaYYxYSIAESIAES6AqBA7viKP0kARIgARJIIDAmeTC8Uoe1ExFb5H8cr8thhx1CaKGnKyUg39qJjPelFCiYB6Jw4UQZzE1DGJs40HOIHkQGEiABEiABEhhhAuyBq/nisweuZsA0TwIkUB0Bd6gihBIEkw4bJEILNzvUEXnzeuas3YXaMM9JgARIgARIgARSCFDApVDqIw8FXB/wWJQESIAESIAESIAESIAESGAKgXeRBwmQAAmQAAmQAAmQAAmQAAmQQDcIUMB14zrRSxIgARIgARIgARIgARIgARIwFHD8EJAACZAACZAACZAACZAACZBARwhQwA3wQq1cuXKAtbNqEiABEiABEiABEiABEiCBrhGggOvaFaO/JEACJEACJEACJEACJEACI0uAAq7BS88etwZhsyoSIAESIAESIAES6BABrFxuVy8v6naZsqEyoXjXJ1+e1LgibfPZRHlfvC8upa4y5UJlQvEpfhTJw428i9DqIy/FWx/wWJQESIAESIAESIAEhogAHvRDIZT2zjvvhIoYpFnxEMvnM+DWl1o2pT5r17UZapvrV6oPvraUiUtpS8huGXYhW0XiuQ9cEVol8uLCLl++3PtGBfEMJEACUZ1EUQAAGwtJREFUJEACJEACJEACo0nAJ3JAIhQfo1S0jJvfJ6xShJTPhhVE8DVkI1ROt93XJl+cLhfj5EsL2fTl1XWVZReynRJPAZdCqY889qKuWLEis0LR1gdMFiUBEiABEiABEiCBISOgxYM+d5vrEwtFcFhB5drRgitWP+rqxwddv67btR9L02128+o0nOel+8roOO27tuvzV9uo6pxz4KoimWOHwi0HEJNJgARIgARIgARIYMgJQPzowzbZxutzNz9EgnvYvEXj3XIuclechfzUdVlh49oJ5fG1Ubc35SNg7btl8beuN+aTTQuVCcW75Vz7KexS2paShz1wKZT6yGMvpu/D3YdZFiUBEiABEmgpgaK/+1XkL2qjKnSDqrcq/2mHBLpOIPQdDMWjva7QwPOpzqvPY4xcW758oedftw5dX2qabgvOdX3atutjKC0Ur+vrl52PV2oce+BSSTEfCZAACZAACdRAwD5w5D0I1VB13ybL+I525h19O0YDJNABAnnfA5teZVOq+p1xfbM9VdZP97yONoR4aPEWylc2vip2uv4yCx1yFUpNkeckQAIkQAIk4CEQunkXeWgI2bDV+dJd+za9SJ2eppSO8vkX892m+fz1xcXsl3aaBUmg5QTwXfB9t1O+D7Ys8trvlM+W/i7aPLG8PmyuT77vsFvG9SfVP1+dvjjNJsTQV9ZlATupvmm+RdnFfCmaxh64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BEiABEiABEigKIHRG0JZlBDzFyaQJ1YKG5wo4D5Il7VRplzRenX7feV9cSHffGLD7WHMs6X9CdWj4/Ps6vyh8zJ2Qj4jHva0TX1uffHZCeVFGZvmltOsfTZDbWc8CZAACZAACZAACVRNgD1wVROlvcoJ+B6qUytB2dADd1G7RfP362M/9aWWjfGx/qfkKdJW5A1dk1Q7/eZz22RZpfhVJYt+28DyJEACJEACJEACo0mAAm40rztbTQIkQAIkQAIkQAIkQAIk0EEC3Mi7gxeNLpMACZAACZAACZAACZAACYwmAQq40bzubDUJkAAJkAAJkAAJkAAJkEAHCVDAdfCi0WUSIAESIAESIAESIAESIIHRJEABN5rXna0mARIgARIgARIgARIgARLoIAEKuA5eNLpMAiRAAiRAAiRAAiRAAiQwmgQo4EbzurPVJEACJEACJEACJEACJEACHSRAAdfBi0aXSYAESIAESIAESIAESIAERpMABdxoXne2mgRIgARIgARIgARIgARIoIMEKOA6eNHoMgmQAAmQAAmQAAmQAAmQwGgSoIAbzevOVpMACZAACZAACZAACZAACXSQAAVcBy8aXSYBEiABEiABEiABEiABEhhNAhRwo3nd2WoSIAESIAESIAESIAESIIEOEqCA6+BFo8skQAIkQAIkQAIkQAIkQAKjSYACbjSvO1tNAiRAAiRAAiRAAiRAAiTQQQIUcB28aHSZBEiABEiABEiABEiABEhgNAlQwA3wuq9cuXKAtbNqEiABEiABEiABEiABEiCBrhGggOvaFaO/JEACJEACJEACJEACJEACI0uAAq7BS88etwZhsyoSIAESIAESIAESIAESGEICFHANXVSKt4ZAsxoSIAESIAESIAESIAESGGICB7wjYYjb14qmhcTb8uXLW+EfnSABEiABEiABEiABEiABEugGAQq4hq6TFXEUbQ0BZzUkQAIkQAIkQAIkQAIkMIQEOISyoYtK4dYQaFZDAiRAAiRAAiRAAiRAAkNMgD1wQ3xx2TQSIAESIAESIAESIAESIIHhIsAeuOG6nmwNCZAACZAACZAACZAACZDAEBOggBvii8umkQAJkAAJkAAJkAAJkAAJDBcBCrjhup5sDQmQAAmQAAmQAAmQAAmQwBAToIAb4ovLppEACZAACZAACZAACZAACQwXAQq44bqebA0JkAAJkAAJkAAJ/P/t1zENAAAAgzD/rvFBKmHdBQECBMYCAm58rmkECBAgQIAAAQIECLwEBNzrT2sIECBAgAABAgQIEBgLCLjxuaYRIECAAAECBAgQIPASCDJfI41ygG3rAAAAAElFTkSuQmCC" alt="" />
a)、符号连接文件本身也是一种文件,所以我们也可以建立起符号连接文件的硬连接。
b)、也可以建立符号连接的符号连接,多级符号连接。
c)、符号连接实现了对其指向文件的间接访问,并且可以跨文件系统,也就是说符号连 接文件和它所指向文件可以在不同的文件系统中,因为符号连接目录项和符号连接间接
指向的文件的inode是不同inode节点,它们可以分属不同的文件系统。
d)、可以对任何类型的文件建立符号文件,包括目录在内。
17.2、符号跟随与符号不跟随函数
我们前面学习stat、fstat和lstate时,说过前面两个是符号跟随函数,第三个是符号不跟随函数,那么具体解释如下:
1)、符号跟随
函数处理的是符号连接背后所指向的文件,不管这个符号连接有多少级,都是一级一级找下去,直到找到最后最后一个符号连接指向的文件,如果其中任意一个符号连接指向的文件被删除的话,那么函数调用会失败并出错处返回。
2)、符号不跟随
函数直接处理的是符号连接文件本身,而不是它所指向的对象。
17.2.1、常见符号跟随函数
access:按照实际ID进行权限测试的函数,本章函数
chdir:切换目录函数(功能同cd命令),本章后面知识
chown:修改文件所属用户ID和所属组ID,本章
chmod:修改文件权限函数,第三章函数
exec:执行新的可执行文件的函数,进程控制章节
link:建立硬连接函数,本章
mkdir:建立新目录函数,本章
mkfifo:创建有名管道,进程间通信章
open:打开和创建文件,第三章
opendir:打开目录文件,本章
stat:从磁盘读inode取文件属性,本章
fstat:从内存inode结构读取文件属性,本章
truncate、ftruncate:阶段函数,本章
17.2.1、常见符号不跟随函数
lchown:chown的兄弟函数,但是不符号跟随
lstat:stat的兄弟函数,但是不符号跟随
readlink:专门读取符号连接文件中存放的其间接指向的文件路径名,命令readlink就是这个 函数的接口,使用如readlink 符号连接。
remove:可删除所有类型文件硬连接。
unlink:删除非目录文件的硬连接。
rename:文件更名。
17.3、目录的符号链接
请看下列命令:
ln -s . test_dir //给当前目录创建一个符号连接
ls test_dir -al 结果如下:
lrwxrwxrwx. 1 linux root 1 May 5 16:57 test_dir -> .
cd test_dir/;pwd 结果如下:
/home/linux/test_dir
cd test_dir/;pwd 结果如下:
/home/linux/test_dir/test_dir
cd test_dir/;pwd 结果如下:
/home/linux/test_dir/test_dir/test_dir
cd test_dir/;pwd 结果如下:
/home/linux/test_dir/test_dir/test_dir/test_dir
cd test_dir/;pwd 结果如下:
/home/linux/test_dir/test_dir/test_dir/test_dir/test_dir
从上面的黑体字中我们可以看出,对目录已经开始形成了循环,
aaarticlea/png;base64,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" alt="" />
上图方框代表目录,圆圈代表符号连接,test_dir间接指向了当前目录,所以我们cd test_dir时,就会造成死循环,总是进入到当前目录中。
aaarticlea/png;base64,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*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" alt="" />
unlink不能操作目录,但是符号连接并不是目录,如的打叉部分所示,一旦符号连接自己的硬链接被unlink断掉,整个符号连接将不复存在。
对普通用户来说是不能建立目录的硬连接的,因为一旦建立,就无法删除目录项的硬连接,如果造成了目录的死循环就会很麻烦,但是符号连接不会,它很容可以很容易的被unlink删除。
17.4、ls命令显示符号连接文件
1)、-l选项
ls -l显示符号连接文件会有两个提示。
a)、第一个字符l,说明是符号连接。
b)、->,指向某个文件。
2)、-F选项
ls -F,符号连接文件后面会跟一个@符号,说明它是一个符号连接文件。当同时使用-l和-F时,如ls -l -F或ls -lF,F将会被l屏蔽掉,没有用处,因为-l已经能够很清楚的显示出文件的属性,F是多余的。
18、与符号相关的函数,symlink和readlink函数
18.1、symlink函数
18.1.1函数原型和所需头文件
#include <unistd.h>
int symlink(const char *oldpath, const char *newpath);
18.1.2、函数功能:创建符号连接目录项
18.1.3、函数参数
•const char *oldpath:符号连接指向的目录项路径名
•const char *newpath:符号连接目录项的的路径名
18.1.4、函数返回值:调用成功返回0,失败返回-1,errno被设置
18.1.5、测试用例:略
18.1.6、注意
1)、oldpath指向的文件不见得一定要存在,但是最好要存在,否者很多符号跟随的操作会 产生错误。
2)、oldpath对应的文件和newpath对应符号连接文件可以在不同的文件系统中。
18.2、readlink函数
18.2.1函数原型和所需头文件
#include <unistd.h>
ssize_t readlink(const char *path, char *buf, size_t bufsiz);
18.2.2、函数功能:读符号连接的内容,符号连接文件中存放的是指向文件的路径名。
18.2.3、函数参数
•const char *path:符号连接文件的路径名。
•char *buf:存放符号连接指向的文件的路径名字。
•size_t bufsiz:buf的大小
18.2.4、函数返回值:调用成功返回实际读到的buf中的字节数,失败返回-1,errno被设置
18.2.5、测试用例:略
18.2.6、注意
1)、此函数组合了open,read,close三个函数。
2)、返回字节数,但是不包含‘\0’。
19、文件的时间
19.1、与文件相关的时间
在struct stat机构体中与文件时间相关的成员项有如下三个:
1)、对文件内容最后的读取时间:st_atime。
2)、对文件内容的最后的改写时间:st_mtime。
3)、对文件状态的最后改写时间:st_ctime。
19.1、对文件内容最后的读取时间st_atime
1)、含义:文件内容最后一次被访读取的时间。
2)、举例:比如最后一次read文件内容的时间。
3)、ls 如何显示该时间:加-u选项。
4)、作用:便于管理员归档管理文件用,比如删除1月之内没有被读取过的可执行文件,就可 以按照这个时间进行操作。
19.2、对文件内容最后的改写时间st_mtime
1)、含义:文件内容最后一次被改写的时间。
2)、举例:比如最后一次wrie文件内容的时间。
3)、ls 如何显示该时间:缺省情况下(默认情况下)显示的就是这个时间。
4)、作用:便于管理员按照该文件对文件进行归档和管理。
19.3、对文件状态最后的改写时间st_ctime
1)、含义:文件状态(也就是inode节点)最后一次被改写的时间。
2)、举例:比如最后一次chmod、chown或ln的时间,这些函数都会导致i节点被修改。
3)、ls 如何显示该时间:缺省情况下(默认情况下)显示的就是这个时间
4)、作用:便于管理员按照该文件对文件进行归档和管理
5)、注意,对于i节点来说,不存在最后一次被读取的时间,所以access和stat函数并不会修改 st_ctime。
20、mkdir函数和rmdir函数
20.1、mkdir函数
20.1.1函数原型和所需头文件
#include <sys/stat.h>
#include <sys/types.h>
int mkdir(const char *pathname, mode_t mode);
20.1.2、函数功能:创建新目录。
20.1.3、函数参数
•const char *pathname:需创建目录的路径名
•mode_t mode:新目录创建的权限,一般给0775
20.1.4、函数返回值:调用成功返回0,失败返回-1,errno被设置
20.1.5、测试用例:略
20.1.6、注意
1)、新创建的空的目录里面会自动包含. 和.. 两个目录项。
2)、mode会受到进程屏蔽字的修改。
3)、mkdir命令就是对这个函数的封装。
20.2、rmdir函数
20.2.1函数原型和所需头文件
#include <unistd.h>
int rmdir(const char *pathname);
20.2.2、函数功能:删除目录。
20.2.3、函数参数
•const char *pathname:需删除目录的路径名
20.2.4、函数返回值:调用成功返回0,失败返回-1,errno被设置
20.2.5、测试用例:略
20.2.6、注意
1)、此函数想要执行成功,被删除的目录必须为空(只包含. 和.. 两个目录项)。
2)、与目录有关的所有的用连接一次性被减为0。
3)、如果检测到连接数为0了,但是还有进程正打开了这个目录并且进程没有结束,
那么这个目录在数据区对应的目录块是不会被删除的,这一点类似于unlink函数操作非
目录文件。
21、打开目录,读目录等函数
21.1、opendir函数
21.1.1函数原型和所需头文件
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
21.1.2、函数功能:打开目录文件。
21.1.3、函数参数
•const char *name:需打开目录的路径名
21.1.4、函数返回值:成功返回指向目录文件流的目录文件指针,失败返回NULL,errno被设置。
21.1.5、测试用例:略
21.1.6、注意:openddir是一个库函数
21.2、readdir函数
21.2.1函数原型和所需头文件
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
21.2.2、函数功能:读目录文件里的目录项。
21.2.3、函数参数
•DIR *dirp:opendir打开目录文件时返回的目录流指针。
21.2.4、函数返回值:成功则返回一个指针指向dirent结构体,返回NULL的话有如下两种情况:
1)、读到目录文件的末尾则返回NULL,errno保持原有设置,不发生变化。
2)、函数调用失败也返回NULL,但是errno被设置。
21.2.5、测试用例:略
21.2.6、注意
dirent结构定义在了<dirent.h>头文件中,它的具体成员实现如下:
struct dirent
{
ino_t d_ino; /* i节点编号 */
off_t d_off; /* 到下一个目录项的地址偏移 */
unsigned short d_reclen; /* 目录项里面存放的信息的长度 */
unsigned char d_type; /*文件类型,不是所有系统都支持,
并且在i节点中有文件类型的说明 */
char d_name[256]; /* 文件名字 */
};
1)、上面这个结构是用来存放目录项的相关信息的,其中最重要的就是i节点编号和文件 名字。
2)、我们前面说过,早期目录项的大小是固定的,比如给目录项16个字节,14个字节用 来表示文件名,2个字节来存放i节点编号,但是对于现在的系统来说就不再是了,为了存 放各种长度不一的文件名,现在的目录项大小会随着文件名的长度的大小发生变化,目录项 的存放形式类似于我们前面学过的数组。
aaarticlea/png;base64,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" alt="" />
数组的每一项的大小是相同的,但是这里的每一项的空间大小是可变的(随名字的长度变化),所以访问下一个目录项,需要用到一个偏移,这个偏移说明了从当前目录项的开始处移动多少字节可以访问到下一个目录项,这个偏移就是d_off,d_type代表的是目录项中实际存放的记录的长度,d_type <= d_off。
3)、readdir是一个库函数。
21.3、rewinddir函数
21.3.1函数原型和所需头文件
#include <sys/types.h>
#include <dirent.h>
void rewinddir(DIR *dirp);
21.3.2、函数功能:将对目录的读写指针调到目录项列表的第一个目录项最开始处。
21.3.3、函数参数:DIR *dirp:opendir打开目录文件时返回的目录文件流指针。
21.3.4、函数返回值:无返回值
21.3.5、测试用例:略
21.3.6、注意:它是一个库函数
21.4、closedir函数
21.4.1函数原型和所需头文件
#include <sys/types.h>
#include <dirent.h>
void closedir(DIR *dirp);
21.4.2、函数功能:关闭目录文件。
21.4.3、函数参数:DIR *dirp:opendir打开目录文件时返回的目录文件流指针。
21.4.4、函数返回值:无成功返回0,失败返回-1,errno被设置。
21.4.5、测试用例:略
21.4.6、注意:它是一个库函数
22、chdir、和getcwd函数
22.1、chdir函数
22.1.1函数原型和所需头文件
#include <unistd.h>
int chdir(const char *path);
22.1.2、函数功能:切换目录。
22.1.3、函数参数:const char *path:路径。
22.1.4、函数返回值:无成功返回0,失败返回-1,errno被设置。
22.1.5、测试用例:略
22.1.6、注意:
当前工作目录与我们的进程息息相关,有的时候我们进程需要从当前工作目录切换到其它的目录下,这个时候就需要调用到这个函数。
22.2、chdir函数
22.2.1函数原型和所需头文件
#include <unistd.h>
char *getcwd(char *buf, size_t size);
22.2.2、函数功能:获取进程的当前工作目录。
22.2.3、函数参数:
const char *path:存放当前路径(一个字符串)。
size_t size:buf允许的大小
22.2.4、函数返回值:无成功返回0,失败返回-1,errno被设置。
22.2.5、测试用例:略
22.2.6、注意:它是一个库函数。
23、自己简单实现ls命令
23.1、功能要求:
1)、显示指定文件的属性
2)、如果是目录,需要显示目录里面的文件的属性,如果目录里面还有目录,那么也要显示那
些目录下的文件的属性,递归实现,知道所有的目录下的文件属性都被现实位置。
23.2、例子代码
/* 所需头文件如下 */
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <errno.h>
#include <pwd.h>
#include <grp.h>
#include <time.h> /* 定义一个存放文件类型的数组 */
int file_type[] =
{
S_IFSOCK,
S_IFLNK,
S_IFREG,
S_IFBLK,
S_IFDIR,
S_IFCHR,
S_IFIFO,
}; /* ls :显示文件属性*/
void display_file_distribute_fun(char *file_path)
{
int i = , ret = -;
struct stat stat_buf = {};
char buf[] = {}; //存放文件属性,这些属性都已字符串形式存放
char *pos = NULL; //
struct passwd *pass_p = NULL;
struct group *gir_p = NULL;
char tim_buf[] = {};
char file_path_name[] = {};
struct tm *tm_p = NULL; /* fstat: 利用文件描述副操作,从v节点中的i节点信息中
* 读取文件属性,因为之前的open函数已经将文件的属性
* 从磁盘中读到了v节点中的i节点信息中
* state: 这个函数和fstat功能是一样的,但是它直接的从
* 磁盘中读取文件属性
* lstat: 前面的fstat和state都是符号链接跟随函数,但是
* lstat不是的,专门用于显示符号链接文件的属性 */
ret = lstat(file_path, &stat_buf);
if(- == ret)
{
fprintf(stderr, "stat \"%s\" is fail: %s\n", file_path, strerror(errno));
exit(-);
} /* 从st_mode中获取文件的类型,存入buf中 */
for(i=; i<sizeof(file_type)/ ; i++)
{
if((stat_buf.st_mode & S_IFMT) == file_type[i])
{
buf[] = "sl-bdcf"[i]; //将文件类型存到buf中
}
} /* 判断是不是目录文件,如果是目录文件的话,需要递归显示,这里除去. 和.. ,否者
* 会造成递归死循环下去 */
if('d'==buf[] && strcmp(file_path, ".")!= && \
strcmp(file_path, "..")!=)
{
DIR *dir_p = NULL;
char pwd[] = {}; //保存当前目录用
struct dirent *dirent_p = NULL; //存放读到的目录项信息 /* 切换到这个目录下面 */
getcwd(pwd, sizeof(pwd));//保存当前目录
chdir(file_path);//切入该目录中 /* 打开目录 */
dir_p = opendir(".");//打开目录文件
if(NULL == dir_p)
{
fprintf(stderr, "opendir \"%s\" is fail: %s\n", \
".", strerror(errno));
exit(-);
} while()
{
/* 如果返回的时NULL,目录项被读完了 */
dirent_p = readdir(dir_p);
if(NULL == dirent_p) break; //递归调用,显示目录项下文件的属性
display_file_distribute_fun(dirent_p->d_name);
} printf("======= dir %s over =======\n\n", file_path);
chdir(pwd);//切换回上一集目录
} /* 对符号链接文件的名字做处理,将名字修改为 XXX -> YYY形式 */
if(buf[] == 'l')
{
char t_buf[] = {}; readlink(file_path, t_buf, sizeof(t_buf));
sprintf(file_path_name, "%s -> %s", file_path, t_buf);
}
else strcpy(file_path_name, file_path); //否者不用修改 /* 从st_mode中读取出文件的权限,存入buf中 */
for(i=; i<; i++)
{
if(stat_buf.st_mode & (<<(-i)))
{
buf[+i] = "rwxrwxrwx"[i];
}
else buf[+i] = '-'; if(stat_buf.st_mode & (<<)) buf[] = 's';
if(stat_buf.st_mode & (<<)) buf[] = 's';
} /* 将数值的uid和gid转换为我们能识别的字符串,如将500转为linux,存入buf中
* 如下函数在后续章节中陆续会学到,大家这里先了解 */
pos = &buf[strlen(buf)]; //找到在buf中续接存放后续属性信息的位置
tm_p = localtime(&(stat_buf.st_mtime)); //将数值秒数转为独立的年、月、日、时、分、秒
pass_p = getpwuid(stat_buf.st_uid); //将数值的uid转换为字符串
gir_p = getgrgid(stat_buf.st_gid); //将字符的gid转换为字符串 //将年月日时分秒组织为我们需要的格式
strftime(tim_buf, sizeof(tim_buf), "%b %d %H:%M", tm_p); /* 将连接计数,所属用户uid,所属组gid,文件大小,文件内容最户一次修改的时间,
* 文件名字等文件属性的信息也续接存放到buf中pos所指向的位置*/
sprintf(pos, ". %d %s %s %ld %s %s", stat_buf.st_nlink, \
pass_p->pw_name, gir_p->gr_name, stat_buf.st_size, \
tim_buf, file_path_name); printf("%s\n", buf); //从buf中打印出文件属性 return;
} /* 主函数 */
int main(int argc, char *argv[])
{
int i = ;
/* 如果忘记输入需被显示属性的文件的名字的话,报错 */
if( == argc)
{
printf("./a.out file_name ...\n");
exit(-);
}
/* 显示,命令行输入文件的属性 */
for(i=; i<argc; i++) display_file_distribute_fun(argv[i]); return ;
}