三.文件系统

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值