一、Linux文件系统结构
1、 文件操作的基本元素:目录结构(目录项)、索引节点(i节点)、文件的数据
2、从文件名到文件内容:
在目录中找到文件名--->目录项中包含i节点的位置----->在i节点中找到数据块的列表
二、文件硬链接
1、创建硬链接的shell命令
ln srcpath newpath
2、硬链接在内核中的存在形态
3、创建文件硬链接的相关API
int link(const char * existingpath ,const char * newpath);
创建一个指向现存文件的硬链接,成功返回0,失败返回-1
int unlink(const char *pathname);
删除pathname指定的硬链接,并将由pathname所引用的文件链接数减1,成功返回0,失败返回-1
#include <stdio.h>
#include <unistd.h>
int main(int argc, char ** argv)
{
if(argc < 3)
{
printf("usage: %s srcPath destPath1 destPath2 ...",argv[0]);
return -1;
}
int i = 0;
for(i = 2;i < argc;i ++)
{
if(link(argv[1],argv[i]) < 0)
{
printf("%s link error\n",argv[i]);
continue;
}
}
return 0;
}
三、文件软连接
1、创建文件软连接的shell命令
ln -s srcpath newpath
软连接在内核中的存在形态:
2、软连接相关的API
int symlink(const char * actualpath, const char * sympath);
创建一个符号链接(软连接),成功返回0,出错返回-1
int readlink(const char* pathname,char * buf,size_t size);
打开该链接,并读取软连接的名字,注意读到的是pathname而不是内容。成功返回读到的字节数,出错返回-1.
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc,char ** argv)
{
if(argc != 3)
{
printf("usage : %s actualpath sympath\n",argv[0]);
return -1;
}
if(symlink(argv[1],argv[2]) < 0)
{
printf("symlink error\n");
return -1;
}
int fd = -1,size = 0;
char buf[1024] = {0};
fd = open(argv[2],O_RDONLY);
if(fd < 0)
{
printf("open error\n");
return -1;
}
//读软链接指向的原文件的内容
size = read(fd,buf,1024);
if(size > 0)
{
write(STDOUT_FILENO,buf,size);
printf("\n");
}
memset(buf,0,1024);
//读软连接指向的源文件的文件名
if((size = readlink(argv[2],buf,1024)) > 0)
{
write(STDOUT_FILENO,buf,size);
printf("\n");
}
close(fd);
return 0;
}