一、硬链接和软链接
1、硬链接: 与普通文件没什么不同,inode 都指向同一个文件在硬盘中的区块。文件的 inode 值,你可以简单把它想成 C 语言中的指针。它指向了物理硬盘的一个区块,事实上文件系统会维护一个引用计数,只要有文件指向这个区块,它就不会从硬盘上消失。
2、软链接: 保存了其代表的文件的绝对路径,是另外一种文件,相当于快捷方式,在硬盘上有独立的区块,访问时替换自身路径。
硬链接的两个文件inode值不同,软链接的两个文件inode值相同。
3、硬链接的创建和删除:
int link(const char *oldpath,const char *newpath);
int unlink(const char *pathname);
4、软链接的创建和删除:
int symlink(const char * oldpath, const char * newpath);
int unlink(const char *pathname);
5、根据软链接路径找到其源文件路径:readlink()调用
int readlink(const char * path, char * buf, size_t bufsiz);
函数的作用是将软链接path的源文件路径找出来,并放在buf里面。
例如:
#include <stdio.h>
int main(int argc,char *argv[])
{
char buf[1024];
symlink("./test1", "./testpass");
readlink("./testpass",buf,1024);
printf("%s\n",buf); //打印./test1
return 0;
}
二、文件和目录的操作
1、文件重命名或移动文件(相当于shell的mv):rename系统调用:
int rename(const char *oldpath,const char *newpath);
oldpath和newpath在一个目录,对文件重命名,否则对文件进行移动。
2、创建和删除目录:
int mkdir(const char *pathname, mode_t mode);
int rmdir(const char *pathname);
3、删除一个文件或目录:
int remove(const char *pathname);
4、打开目录和读目录:
opendir用于打开一个目录:
DIR *opendir(const char *name)
name表示打开目录的路径。
readdir用于读目录 :
struct dirent *readdir(DIR *dirp);
读目录的结果存储在结构体dirent中:
struct dirent
{
ino_t d_ino; //此目录进入点的inode
ff_t d_off; //目录文件开头至此目录进入点的位移
signed short int d_reclen; //d_name 的长度,不包含NULL
unsigned char d_type; //d_name 所指的文件类型
har d_name[256]; //文件名
}
示例程序:功能是递归遍历并打印当前目录的所有文件名:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
int trave_dir(char *path)
{
DIR *d;
struct dirent *file;
char new_path[1024];
if(!(d = opendir(path))) //opendir打开一个目录,返回类型为DIR *d;
{
printf("err path %s\n",path);
printf("error opendir!!!\n");
return -1;
}
while((file = readdir(d)) != NULL) //readdir读目录,传入参数为DIR *d,返回类型为struct dirent *file
{
if((strcmp(file->d_name,".")==0) || (strcmp(file->d_name,"..")==0)) //过滤. 和 ..
{
continue;
}
if((strcmp(file->d_name,".svn")==0)) //笔者编译服务器上有svn版本控制,需要去掉.svn文件
{
continue;
}
if(file->d_type==DT_DIR) //如果是目录的话就递归调用trave_dir
{
sprintf(new_path, "%s/%s", path,file->d_name);
trave_dir(new_path);
}
else //其他文件类型直接打印
{
printf("%s\n",file->d_name);
}
}
closedir(d); //关闭目录
return 0;
}
int main(int argc,char *argv[])
{
trave_dir("./");
return 0;
}
5、获取与改变当前目录:(相当于shell的pwd和cd命令)
char getcwd(char *buf, unsigned long size);
将当前工作路径存放在buf中。
int chdir(const char *path);
改变当前工作目录为path。
6、改变根目录:chroot
int chroot(const char *path);
为何使用 chroot?
在经过 chroot 之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下的目录结构和文件,因此它带来的好处大致有以下3个:
增加了系统的安全性,限制了用户的权力。在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。这个一般是在登录 (login) 前使用 chroot,以此达到用户不能访问一些特定的文件。
建立一个与原系统隔离的系统目录结构,方便用户的开发。使用 chroot 后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。
切换系统的根目录位置,引导 Linux 系统启动以及急救系统等。chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 RAM 磁盘切换系统的根位置并执行真正的 init。另外,当系统出现一些问题时,我们也可以使用 chroot 来切换到一个临时的系统。
7、改变文件的属主和属组:chown()
int chown(const char *pathname,uid_t owner,gid_t group);
owner表示用户id,group表示组id
8、修改文件的读写属性:chmod()
int chmod(const char *filename,mode_t mode)
mode参数可为:S_IRUSR、S_IWUSR、S_IXUSR、S_IRGRP、S_IWGRP
9、检查调用进程是否可以对指定的文件执行某种操作:access()
int access(const char *pathname, int mode)
mode参数可为一个或多个R_OK(可读?), W_OK(可写?), X_OK(可执行?) 或 F_OK(文件存在?)组合体。成功执行时,返回0。失败返回-1。