Linux下的软连接和硬链接

来源:互联网 发布:cdma网络是什么意思 编辑:程序博客网 时间:2024/05/21 21:34

Linux下的软连接和硬链接

首先说一下什么是软连接和硬链接吧:
硬链接:就是创建在原来文件基础之上,类似在创建一个文件,不依赖源文件。每次硬链接一次都会在原来的文件基础之上链接数再加1;
软连接:在原来文件的基础之上,创建一个类似windows下的快捷方式,它以来源文件,如果源文件没了的话,那么这个“这个快捷方式”也就没有用了

下面演示下命令行下创建软链接和硬链接,都是使用 ln命令

 硬链接     ln a.txt l_a 软连接:     ln -s a.txt s_a

这里写图片描述
上面图示中我们可以看到对a.txt创建了一个软连接s_a和一个硬链接l_a
,软链接有一个箭头指向了a.txt源文件,而硬链接有一个2显示出来,标识a.txt的链接数是2

这里写图片描述
上面的图就是删除了源文件 之后,软链接的变成红色了,因为软链接指向的源文件已经丢失了所以可以看出来,而硬链接不变,不懂的可以试一下,硬链接还是可以进行访问的,也可以看到文本文件中的数据,但是软连接就不行

说说关于Linux系统下,创建软硬链接的函数调用:

软链接:symlink

#include<unistd.h>int symlink(const char*actualpath,const char *sympath);返回:成功返回0,出错返回-1功能:创建一个符号链接(软链接)int readlink(const char *restrict pathname,char *restrict buf,size_t bufsize);返回:成功读到子节数为0,失败为-1功能:打开该链接本身,并读该链接中的名字符号创建链接:创建符号链接不要求actualpath存在可以跨文件系统建立符号链接限制条件相对比较少

硬链接link

 link和unlink函数#include<unistd.h>int link(const char *existingpath,const char*newpath);返回:成功返回0,出错返回-1功能:创建一个指向现存文件的连接(硬链接)int unlink(const char*pathname);返回:成功返回0,出错返回-1;    功能:删除pathname制定的硬链接,并将由pathname所引用的文件连接数减1硬链接的创建条件:针对文件创建链接必须是同一个分区只用超级用户才能对目录创建链接文件删除条件:链接计数为0无其他进程打开该文件

其他相关的操作函数:

#include<unistd.h>int remove(const char *pathname)返回:成功返回0,失败返回-1功能:解除对一个文件或者目录的链接int rename(const *oldname,const char *newname);返回:成功返回0,出错返回-1功能:文件或者目录更名对于文件:remove和unlink一样对于目录:remove和rmdir一样

下面就针对上图的图示中的软硬链接写一个比较简单的Demo,当然这个可能在实际过程中相对来说是比较少用的,但是真正设计到的是整个系统的文件系统的原理,这个才是最重要的。有兴趣的童鞋可以www.baidu.com一下,Linux的系统文件存储原理

上Code了,用代码创建软链接部分的代码

#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>#include<memory.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>/***argv[1]为源文件。argv[i]为链接文件*/int main(int argc,char* argv[]){    if(argc == 1){        printf("缺少参数");        exit(EXIT_FAILURE);    }    int result = symlink(argv[1],argv[2]);    if(result == 0){        printf("create success\n");    }else{        printf("create failed\n");    }    char buffer[1024];    ssize_t read_result;    memset(buffer,0,sizeof(buffer));    int fd = open(argv[2],O_RDONLY);    if(fd <0){        perror("open error\n");        exit(EXIT_FAILURE);    }    //一定要注意括号是怎么打的,通过文件读写去读取文件内容     while((read_result = read(fd,buffer,sizeof(buffer)))>0){        if(write(STDOUT_FILENO,buffer,read_result) > 0){                printf("\n");                printf("read success\n");        }else{                printf("\n");                printf("read failed\n");            }         }        memset(buffer,0,sizeof(buffer));        //一定要注意不要少括号,这里是通过软连接去读取文件内容        if((read_result = readlink(argv[2],buffer,sizeof(buffer)))<0){            perror("readlink error");        }else{            write(STDOUT_FILENO,buffer,read_result);        }        printf("\n");        close(fd);    return 0;}

创建硬链接部分的代码:

#include<stdio.h>#include<unistd.h>#include<sys/stat.h>#include<sys/types.h>#include<stdlib.h>#include<fcntl.h>int main(int argc,char * argv[]){    if(argc<3){        printf("缺少参数\n");        exit(EXIT_FAILURE);    }    int i = 0;    for(i = 2; i<argc ;i++){        int link_result = link(argv[1],argv[i]);        if(link_result < 0){            printf("create hard link failed\n");            continue;        }else{            printf("create hard link success\n");        }       }    return 0;}

这些相对来说都是一些比较简单的Demo,有兴趣的可以把代码拷下去,也可以做一些优化,有些简单的函数在这里就不去进行调用了,有兴趣的可以进行一下拓展。

欢迎访问博客

0 0
原创粉丝点击