1. 文件系统介绍
一.目录和文件
1.获取文件属性:stat,fstat,lstat
2.文件访问权限:st_mode
3.umask
4.文件权限的更改/管理: chmod,fchmod
5.粘住位
6.文件系统是什么东西:FAT,UFS
7.硬链接,符号链接
8.utime
9.目录的创建和销毁
10.更改当前工作路径
11.分析目录/读取目录内容
二.系统的数据文件和信息
三.进程环境
2.stat
功能:These functions return information about a file, in the buffer pointed to by statbuf(信息存在参数statbuf所指向的结构体里)
返回值:On success, zero is returned. On error, -1 is returned, and errno is set appropriately
结构体stat具体内容:
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
/*
读取文件字节数目,用函数stat
*/
static off_t flen(const char* fname) {
struct stat statres;
if (stat(fname, &statres) < 0) {
perror("stat()");
exit(1);
}
return statres.st_size;
}
int main(int argc, char** argv) {
if (argc < 2) {
fprintf(stderr, "Usage...\n");
exit(1);
}
printf("%ld\n", flen(argv[1]));
exit(0);
}
3.空洞文件
假如创建5G大小文件
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char** argv) {
int fd;
if (argc < 2) {
fprintf(stderr, "Usage...\n");
exit(1);
}
fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0600);
if (fd < 0) {
perror("open()");
exit(1);
}
//数据类型转变 int ==> long long
lseek(fd, 5LL * 1024LL * 1024LL *1024LL - 1LL, SEEK_SET);//产生5G大小文件( 如果 whence 是 SEEK_SET,文件偏移量将被设置为 offset)
write(fd, "", 1);
exit(0);
/*
./main /tmp/out
*/
}
但是实际上占用多少磁盘空间呢?
占用8*512B=4k,是个5g的空洞文件
文件如果全是‘\0’字符,不会去write,而是记录下’\0’的长度
4.文件属性
stat结构体st_mode存着文件属性信息
mode_t是unsigned int类型,st_mode可以是以下值:
dcb-lsp7种
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
static unsigned int ftype(const char* fname) {
struct stat statres;
if (stat(fname, &statres) < 0) {
perror("stat()");
exit(1);
}
//判断文件是哪种类型
if (S_ISREG(statres.st_mode))
return '-';
else if (S_ISDIR(statres.st_mode))
return 'd';
else if (S_ISSOCK(statres.st_mode))
return 's';
else if (S_ISCHR(statres.st_mode))
return 'c';
else if (S_ISBLK(statres.st_mode))
return 'b';
else if (S_ISFIFO(statres.st_mode))
return 'p';
else if (S_ISLNK(statres.st_mode))
return 'l';
}
int main(int argc, char** argv) {
if (argc < 2) {
fprintf(stderr, "Usage...\n");
exit(1);
}
printf("%c\n", ftype(argv[1]));
exit(0);
}
5.文件属性和FAT文件系统
umask作用:防止产生权限过松的文件
chmod和fchmod更改权限
粘住位(t位)文件和目录之粘住位
文件系统:FAT,UFS 文件或数据的存储和管理
FAT
6.链接文件和目录操作
硬链接与目录项是同义词,且建立硬链接有限制:不能给分区建立,不能给目录建立。符号链接优点:可跨区,可以给目录建立
硬链接
/tmp下有文件out,命令ln out out_link产生硬链接文件。
相当于两个指针指向同一个数据块
size,blocks,inode都一样,说明是同一个文件。links=2代表硬连接数
现在删掉out,不影响out_link(计数机制)
符号链接
在/tmp下有文件out_link
执行ln -s out_link out_s产生文件out_s
看到size改变了,out_s的size=8,实际上就是out_link字节数,blocks=0说明不占用磁盘,文件类型也从regular file转变成符号链接,inode不同,说明产生的两个文件不是同一个文件了(不同于硬链接)
如果删了源文件(out_link),out_s就会失效
目录操作
函数remove ⇒ rm
函数rename ⇒ mv
utime可以更改文件的最后读的时间和最后修改的时间
函数getcwd ⇒ pwd