除了目录文件之外,Linux系统还有其他的特殊文件,这些文件可以当做普通文件进行处理,但是也有一些特殊性。这里介绍两种特殊文件,一种是符号链接,一种是proc文件系统。
1、符号链接
符号链接是一个重要的概念,符号链接又被称为软连接,在Linux系统中有大量的存在。符号链接可以理解为一个接口,符号链接可以为一个相对封闭的环境提供接口,为一个指向的目的文件提供快捷路径,类似于Windows系统中的快捷方式。
符号链接有两个很重要的特点,第一,符号链接能够方便用户操作。无论你的文件路径有多么复杂,使用符号链接的方式都能够快速的访问到你要访问的文件,不需要经过该文件的路径来访问,方便用户的操作。例如一个文件存放的路径是/home/admin/usr/bin/local/tmp/test.txt,建立一个符号链接s,如果需要对test.txt文件进行读写操作,可以直接对s进行读写操作即可,不用到/home/admin/usr/bin/local/tmp/路径下找到test.txt再进行操作。第二,符号链接增加了系统的安全性。例如,一个银行的系统为例,其内部有a、b、c三个用户,每个客户有一个目录,目录中是客户的信息文件。这三个客户处于一个同一个文件系统中,如下图所示
如果用户a希望自己目录下的password.txt文件对密码进行修改,这时该用户需要经过的路径是/ home/account/Usr_a/dir/password.txt,这时其所经过的目录的安全都会受到威胁。客户a不但可以估算出文件系统的结构,还能得知银行有哪些客户。这些用户操作都为银行系统的安全增加了隐患,同时也存在泄露个人隐私的隐患。如果使用符号链接就能避免这些问题,管理者只需要为password.txt文件新建一个符号链接,客户就可以通过符号链接对password.txt文件进行操作,对于用户来说,整个系统就相当于一个黑匣子。
关于符号链接的操作主要有创建符号链接、读写符号链接的目的文件、读写多重符号链接的目的文件、读写符号链接、取得符号链接的状态、更改符号链接的所有者。因为符号链接自身的特殊性,因此符号链接的操作可以分为两类,一类是针对于符号链接的目的文件的操作,一类是针对于符号链接自身的操作。
创建符号链接使用的函数是 symlink(const char *actualpath, const char *sympath)
头文件: #include <unistd.h>
参数说明:参数1 actualpath表示一个文件的路径,也就是目的文件的路径,这里需要注意的是在创建符号链接的时候,目标文件可以是不存在的,如果目标文件不存在还是会创建这个符号链接;参数2 sympath是新创建的符号链接。
返回值:若成功则返回0,若出错则返回-1。
对于符号链接的操作有两类,对于目标文件的操作和对于符号链接的操作。对于目标文件的读写可以直接用open、read、write函数操作即可;符号链接的本身也是一种文件,其中保存的是目的文件的路径,使用readlink函数进行读操作。
下面两个实际程序代码的对比就能比较出来两者的不同。
对于目的文件读写的代码如下:
1 #include <stdio.h> 2 3 #include <string.h> 4 5 #include <unistd.h> 6 #include <stdlib.h> 7 #include <fcntl.h> 8 #define MAX 1024 9 int main(void) 10 { 11 int fd,n; 12 char buf[MAX]; 13 if(symlink("test.txt", "sym_link") == -1){ /* 创建一个符号链接,目的文件是test.txt */ 14 perror("fail to create symbol link"); 15 exit(1); 16 } 17 printf("already create a symbol-link "); /* 输出提示信息 */ 18 if((fd = open("sym_link", O_RDWR)) == -1){ /* 通过符号链接打开该目的文件 */ 19 perror("fail to open"); 20 exit(1); 21 } 22 if((n = read(fd, buf, MAX)) == -1){ /* 读目的文件的内容 */ 23 perror("fail to read"); 24 exit(1); 25 } 26 buf[n] = '