目录和文件

目标:编写类ls的实现,myls -l -a -i -n

ls -n:查看用户名和组名对应的ID号,对应关系存放在下面两个文件中。
在这里插入图片描述

vim	/etc/passwd
vim /etc/group

一、目录和文件

递归:如果递归层数不受上限,会导致栈资源破裂
1、获取文件属性
2、文件访问权限
3、umask
4、文件权限的更改/管理:chmod,fchmod
5、粘住位
6 、文件系统:FAT,UFS
7、硬链接,符号链接

8、utime
9、目录的创建和销毁
10、更改当前工作路径
11、分析目录/读取目录内容

二、系统数据文件和信息

password,group、文件权限等

三、进程环境

1.C程序的虚拟空间如何搭建
2. 环境变量在程序或系统当中起到的作用

1、获取文件属性

两种命令+参数方式
1.	cmd --长格式 非选项的传参
2.	cmd -短格式 非选项的传参
3.	linux中,任意命令 + -- 表示当前命令的选项结束
4.	touch -a 不对
	touch -- a ✔
	touch ./a √

在这里插入图片描述
获取文件属性常用的三个函数:stat,fstat,lstat
在这里插入图片描述
stat:通过文件名获取文件属性
fstat:通过一个已经打开的文件描述符获取文件属性
lstat:名字多了l,说明和stat在link(链接文件)上有所不同
在这里插入图片描述
st_size:文件大小
st_blksize * st_blocks:文件占用磁盘的大小
二者在linux环境中并不相等,st_size只是文件的一个属性,st_blksize*st_blocks才真正表示文件
占用磁盘的大小。
验证:

//FS/big.c
//生成一个5GB的空洞文件test,对比文件大小和文件在磁盘中的大小
//空洞文件:里面全部是空字符,也就是ASCII为0的字符
int fd;
	fd = open(argv[1], O_WRONLY|O_CREAT|O_TRUNC, 0600);
	if(fd < 0)	
	{
		perror("open");
		exit(1);
	}

	off_t result;
	//result = lseek(fd, 5 * 1024 * 1024 * 1024 - 1, SEEK_END);
	//会造成整数溢出
	//(5 * 1024 * 1024 * 1024 - 1)LL,仍旧会造成溢出
	result = lseek(fd, 5LL * 1024LL * 1024LL * 1024LL -1, SEEK_END);
	if(result < 0)
	{
		close(fd);
		perror("lseek");
	}
$:stat + 文件名:查询文件详细属性信息

在这里插入图片描述
从stat命令查询结果看,生成的结果文件test在磁盘大小为8512bt,也就是4KB。
文件大小为5G。二者并不一致。所以st_size只是文件的一个属性,st_blksize
st_blocks才真正表示文件
占用磁盘的大小。

空洞文件拷贝过程:一段一段的拷贝,如果里面全部是空字符,则cp会计算空字符的长度,但是不执行
write操作。如果文件全部是空洞文件,则不会执行write调用,只在最后执行lseek,把文件位置写进去。

使用stat**函数**查询文件字节大小
```cpp
FS/flen.c
//off_t需要查明是哪种基本类型的别名,知识点1
//static放在函数体内的作用,知识点2
//声明stat结构体,而不是stat结构体指针的原因,知识点3
static off_t flen(const char *fname)
{
    struct stat buf;

    if(stat(fname, &buf) < 0)
    {
        perror("star");
        exit(1);
    }

    return buf.st_size;
}

知识点1
tags 查找linux下typedef类型的原始类型。需要从网上额外安装
安装参考:
tags安装

vim -t off_t

在这里插入图片描述
知识点2

static修饰的函数叫做静态函数,静态函数有两种,根据其出现的地方来分类:

如果这个静态函数出现在类里,那么它是一个静态成员函数
静态成员函数的作用在于:调用这个函数不会访问或者修改任何对象(非static)数据成员。
其实很好理解,类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。

如果它不是出现在类中,那么它是一个普通的全局的静态函数
这样的static函数与普通函数的区别是:用static修饰的函数,限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说它可以被其它代码文件调用。
  在函数的返回类型前加上关键字static,函数就被定义成为静态函数。普通 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。因此定义静态函数有以下好处:
  <1> 其他文件中可以定义相同名字的函数,不会发生冲突。
  <2> 静态函数不能被其他文件所用。

知识点3
stat结构体buf作用域在函数体内部,通过struct stat buf声明当时将buf放在栈中,与函数周期保持一致,不需要额外释放,并且访问栈上资源比访问堆上资源快;
1.char buf[10] //在栈上调用资源
2.char buf;
buf = (char
)malloc(sizeof(char));
//在堆上调用资源

2、文件访问权限

st_mode是一个16位的位图,用于表示文件类型,文件访问权限及特殊权限位

文件属性:
在这里插入图片描述

 drwxrexr-x: 存放在st_mode里面,st_mode类型为mode_t,真正类型为int16
 d:文件类型。分为dcb-lsp共7种
 rwx:当前用户权限,其中d表示目录文件,-表示常规文件 
 rwx: 同组用户权限
 r-x: 其他用户权限

3、umask

0666 & ~umask
作用:防止产生权限过松的文件

4、文件权限的更改/管理:chmod,fchmod

1.命令行中:
chmod a+x src:a表示all user,x表示可执行
表示给所有用户增加对src的可执行权限

2.函数中中改变文件权限
在这里插入图片描述
chmod函数:对一个文件更改权限
fchmod函数:参数为文件描述符fd。故表示对一个已经成功打开的文件更改权限

5、粘住位

t位

6 、文件系统:FAT,UFS

文件系统:文件或数据的存储和管理
FAT16/32: 静态单链表
在这里插入图片描述
分区必要性:FAT16/32文件系统承载能力有限
缺陷
1.N
2.单链表,单向数据查找,没办法逆向查找
优点:
轻量级
使用场合:u盘,SD卡。

UFS
在这里插入图片描述
目录项:
目录文件中每一项包含inode以及对应的文件名

7、硬链接,符号链接

硬链接:目录项的同义词,且建立硬链接有限制:不能给分区建立,不能给目录建立
相当于增加一行目录项,两个文件名关联同一个inode;
在这里插入图片描述
在这里插入图片描述
符号链接
1.类似于windows下快捷方式,与原文件属性是相互独立的;
2.可跨分区,可以给目录建立
在这里插入图片描述
删除原文件后,链接已经报错
在这里插入图片描述
相关函数:link()、unlink()
在这里插入图片描述
在这里插入图片描述
unlink操作后不一定会删除文件。
rm 从磁盘删除文件、释放空间的必要条件:
1.硬链接数删除后为0
2.没有其他进程在打开此文件

unlink也可以产生匿名文件
不可删除空文件或空目录

fopen(inode)
unlink(inode)
//文件仍旧存在磁盘中,只是通过文件名找不到了。
//close文件后,才真正释放文件

rm是通过remove函数封装的
remove函数是真正从磁盘删除一个文件或目录,不可删除空文件或空目录
在这里插入图片描述
mv是通过rename函数封装的
在这里插入图片描述

8.utime

可以更改文件最后读和更改的时间,不常用

9.目录的创建和销毁

mkdir,rmdir
在这里插入图片描述
在这里插入图片描述

10.更改当前工作路径

1.chdir()函数,fchdir()函数,getcwd()函数
命令cd,采用chdir函数进行封装
命令pwd,采用getcwd函数进行封装
在这里插入图片描述
用途:对需要长时间跑的进程,进行切换工作路径,切换到长时间不会销毁的路径下(比如根路径),建立守护进程

11.getline函数

完整获取缓冲区一行的函数
缺点:没有配对函数使用,不能释放内存
实现原理:内部调用malloc()先分配一块内存,内寸不够使用时,不断调用relloc()申请内存,直至获取
完毕;

12. 创建临时文件

要求:1.如何不冲突 2.及时销毁
匿名文件:ls查看不到,但是存在

char* tmpnam(char *s); //非线程安全,并且不能及时销毁
作用:根据给定的文件名创建一个文件
非线程安全: 分配名字->创建文件非原子。分配文件名字,假如时间片耗尽, 另一个任务可能也会分配到此文件名。并且提前完成文件创建。当前任务再根据名字创建文件,就有产生冲突;产生的原因在于此操作是非原子操作
FILE* tmpfile(void); //可以及时销毁。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值