《unix高级环境编程》文件和目录——文件链接

前言

       在Linux系统中利用ln指令产生链接,Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。

硬链接

       硬链接是一种通过文件系统的inode链接产生,硬链接可以认为是一个指针,指向文件inode的指针,系统并不为它重新分配inode。所以存在多个文件指向同一个inode节点,添加硬链接,会使文件的链接数增加。删除多个链接中其中一个连接并不影响inode和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。

       硬链接有两个限制:

  1. 不能创建跨文件系统的硬链接。
  2. 只有超级用户才可以创建目录链接,一般用户不允许创建。

      硬链接的使用

/*************
 * 硬链接指令ln使用方式如下:
 * ln existingfile newfile
 * 说明:
 * 为当前存在的文件existingfile创建新的硬链接,链接文件名为newfile.
*/

举例说明:

/ ********
 * 举例子说明:
 * 列出当前文件存在的信息,包括关键inode节点信息:
********/
 $ ls -il file1 file2
 10890904 -rw-rw-r-- 1  file1
 10890903 -rw-rw-r-- 1  file2
 $ ln file1 hardlink
 $ ls -il file1 file2 hardlink
 10890904 -rw-rw-r-- 2  file1
 10890903 -rw-rw-r-- 1  file2
 10890904 -rw-rw-r-- 2  hardlink
 $ cat file1 hardlink
 Hello, this is the file1.
 Hello, this is the file1. 
 $ rm file1
 $ ls -il file2 hardlink
 10890903 -rw-rw-r-- 1  file2
 10890904 -rw-rw-r-- 1  hardlink
 $ cat hardlink
 Hello, this is the file1.
 $ rm hardlink
 $ cat hardlink
 cat: hardlink: No such file or directory 
      由上面例子我们可以看出,创建硬链接之前,file1 显示的链接数目为1,创建链接后hardlink之后,file1和 hardlink 的链接数目都变为2,但是file1和 hardlink 的inode号码是一样的,说明创建硬链接并不会新建inode节点,只会增加链接数。 因此,创建硬链接使多个文件指向同一个inode节点, 它们具有同样的 inode 索引节点号和文件属性。删除其中任何一个链接,并不会删除原始文件信息,如rm file1 ,只是删除一个链接指针,链接数同时减一,只有将所有指向同一个inode节点的链接指针删除,也即链接数减为0时,内核才会把文件内容从磁盘上删除。

符号链接

       可以在不同文件系统中创建符号链接,任何用户可以创建指向目录的符号链接。给ln指令加上- s选项,则是创建符号链接,它是创建一个独立的文件,而这个文件的数据操作会指向它所链接的那个文件的文件名。当所链接的源文件被删除时,符号链接则打不开该文件,即链接失效。

       举例说明:

/*************
 * 符号链接指令ln使用方式如下:
 * ln -s existingfile newfile
 * 说明:
 * 为当前存在的文件existingfile创建新的符号链接,链接文件名为newfile.
 * 举例子说明:
 * 列出当前文件存在的信息,包括关键inode节点信息:
*/
  $ ls -il file1 file2
  10890912 -rw-rw-r-- 1  file1
  10890903 -rw-rw-r-- 1  file2
  $ ln -s file1 symblink
  $ ls -il file1 file2 symblink
  10890912 -rw-rw-r-- 2  file1
  10890903 -rw-rw-r-- 1  file2
  10890907 lrwxrwxrwx 1  symblink -> file1
  $ cat file1 symblink
  Hello, this is the file1.
  Hello, this is the file1.
  $ rm file1
  $ ls -il file2 symblink
  10890903 -rw-rw-r-- 1  file2
  10890907 lrwxrwxrwx 1  symblink -> file1
  $ cat symblink
  cat: symblink: No such file or directory
 
创建符号链接时,会分配新的inode节点,即是新的文件,链接数目不会增加。

可以得到以下全部结论:

  1. 删除硬连接hardlink,对file1无影响;
  2. 删除原文件file1,对硬连接hardlink没有影响,符号连接symblink失效;
  3. 同时删除原文件file1,硬连接hardlink,整个文件会真正的被删除。

symblink和readlink函数

/**********
 * 函数功能:创建一个符号链接。
 * 返回值:若成功则返回0,若出错则返回-1;
 * 函数原型:
 */
int symblink(const char *actualpath, const char *sympath);
/*********
 * 说明
 * 该函数创建一个指向actualpath的新目录项sympath,创建符号链接时,并不要求
 * actualpath存在,也可以位于不同的文件系统。
 */
/******************
 * 函数功能:打开符号链接
 * 返回值:若成功则返回以读到的字节数,若出错则返回-1;
 * 函数原型:
 */
ssize_t readlink(const char *pathname, char *buf, size_t bufsize);

参考资料

《unix高级环境编程》

你可能感兴趣的:(Unix,高级环境编程,UNIX高级环境编程,文件链接,硬链接,符号链接,unix编程)