• 由link()和symlink()谈到软链接与硬链接


    任何一个文件可以有多个目录项指向其i节点。创建一个向现存文件连接的方法是使用l i n k函数。
    #include <unistd.h>
    int link(const char * e x i s t i n g p a t h, const char * n e w p a t h) ;
    返回:若成功则为0,若出错则为-1
    此函数创建一个新目录项n e w p a t h,它引用现存文件e x i s t i n g p a t h。如若n e w p a t h已经存在,则返回出错。
    这是Apue上关于link函数的介绍,看到这里我并没有在意上面的第一句话,直到下面这个函数出现:
    s y m l i n k函数创建一个符号连接。
    #include <unistd.h>
    int symlink(const char * a c t u a l p a t h, const char * s y m p a t h) ;
    返回:若成功则为0,若出错则为-1
    该函数创建了一个指向a c t u a l p a t h的新目录项s y m p a t h,在创建此符号连接时,并不要求a c t u a l p a t h已经存在,并且,a c t u a l p a t h和s y m p a t h并不需要位于同一文件系统中。
    这两个函数有什么不同?大神们没事儿闲的,不会是写重了吧?其实不同点很容易看出来,但要真正理解缘由,要涉及到linux下的硬链接和软链接(也就是所谓的符号链接)概念!
    符号链接是对一个文件的间接指针,相当于windows下的快捷方式。它与硬链接有所不同,硬连接直接指向文件的i节点。这是个很有趣的区别,用ln命令为文件建立的硬链接等同于原文件,而ln -s建立的符号链接,确是另外的一种文件类型——符号链接(symbolic link)。啰嗦了半天,有什么了不起,不就是不同文件类型嘛!那尝尝这个小问题:用open函数打开符合链接文件,结果会如何?符号链接本身的内容又是什么?该怎样读取它?
    大神们这回又闲了,居然整出如下函数:
    #include <unistd.h>
    int readlink(const char * p a t h n a m e, char *b u f, int b u f s i z e) ;
    返回:若成功则为读的字节数,若出错则为-1
    此函数组合了open, read和c l o s e的所有操作。
    看了如下这张表你就明白了:
    各个函数对符号连接的处理

    Function

    Does not follow symbolic link

    Follows symbolic link

    access

     

    chdir

     

    chmod

     

    chown

    creat

     

    exec

     

    lchown

     

    link

     

    lstat

     

    open

     

    opendir

     

    pathconf

     

    readlink

     

    remove

     

    rename

     

    stat

     

    truncate

     

    unlink

     
    对于不同的文件类型,采用不同的功能函数,这包括对目录文件的处理!在linux的世界里,函数的误用,是个常见的错误。从原理上理解这些函数和基础概念,才能紧绷这根弦儿!
  • 相关阅读:
    什么是Sentinel?它能做什么
    【转】Sentinel 快速入门
    Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 解决
    【转】接口幂等性设计
    springboot1.5版本
    测试左移实践和总结
    测试左移和右移
    Linux-018-Centos Shell 判断软件是否已经安装
    PySe-018-Requests 解决响应乱码
    PySe-017-Requests 访问 HTTPS 网站安全告警信息(TLS Warnings / InsecureRequestWarning)处理
  • 原文地址:https://www.cnblogs.com/thinker-lj/p/3523486.html
Copyright © 2020-2023  润新知