文件和目录,主要讲解文件属性


1.函数相关的关系

int fstatat(int fd,const char *restrict pathname,struct stat *restrict buf,int flag)
在这里共性的一些东西

1)关于fd与pathname,当pathname是绝对路径的时候忽略fd

2)当fd是AT_FDCWD的时候,表明是基于当前工作目录下的pathname

3)当fd是其他的打开目录的时候,则相对于其他的目录

4)flag是控制是否跟随符号连接的

2.stat结构体

本章的函数基本上是围绕这个结构体来展开的,说明了文件的各种属性

1:st_mode里面包含有

文件的类型:FIFO,普通文件,目录文件,块文件,字符文件

设置用户ID和设置组ID:如果设置了,择可以让进程的有效用户和有效用户组变成文件的用户和用户组

与进程相关的ID有六个,分别是实际用户ID,实际组ID

有效用户ID,有效组ID 附属组ID

保存的设置用户ID,保存的设置组ID

其中进程的ID和文件的所属者和所属组ID,虽然都是一个数字对应这root或者别的用户(用户组),但是进程的实际ID确实来自登陆用户所确定的,更改一个程序文件的所属用户并不能改变执行此程序时的实际用户ID,实际用户ID只与登陆时的有关

文件的访问权限:用户读写执行,用户组读写执行,其他读写执行(列如,对一个文件的写权限决定了是否能够打开文件进行写操作,是先有了写权限,采取测试能不能以写方式去打开文件,读,执行是类似的

粘着位:当对目录设置了粘着位的时候,对目录底下的文件删除必须如下:拥有此文件,拥有此目录,是超级用户

相关函数

1.1umask相关

当umask设置了哪几位的时候,在创建文件时候,即指定了文件的mode的时候,就相应的屏蔽掉哪几位

列如umask(S_IRGRP)

creat("bar",RWRWRW);

就屏蔽掉组读

新文件和目录的所有权

新文件的用户ID被设置成进程的有效ID,组ID?

对于linux,如果文件所在目录的设置组ID位被设置,则新文件的组ID设置位目录的组ID,否则为进程的组ID

1.2关于chmod的一个函数

int fchmodat(int fd,const char *pathname,mode_t mode,int flag);

1)关于fd与pathname,当pathname是绝对路径的时候忽略fd

2)当fd是AT_FDCWD的时候,表明是基于当前工作目录下的pathname

3)当fd是其他的打开目录的时候,则相对于其他的目录

4)flag是控制是否跟随符号连接的

注意 chmod是可以置设置用户位为1,也可以设置设置用户组为1,还可以设置粘着位

chmod改变的只是I节点的信息,而ls -l显示的是文件内容最近的改变,所以并不变化时间

2.st_uid,stgid

分别是用户和用户组,可以改变的函数是chown,fchown

在linux中,我们总是对这几个函数有限制的,只有超级用户能够更改文件用户ID

如果进程拥有次文件,并且参数own应该为-1或者用户ID时,group可以是有效组ID或者进程的附属组ID之一,并且应该清除设置用户ID和设置组ID

3.st_size

对于连接文件长度是连接名称的长度

4.st_blksize

文件I/O比较合适的块长度

5.st_blocks

所分配的实际512字节块块数

6.st_nlink

连接数目,有几个硬链接,应用的函数有unlink函数,link,unlinkat函数

其实和remove函数是一样的,删除一个文件只不过是将其连接数减1,如果减到0,则进行删除

7st_ino

此文件的i节点位置,i节点的编号,一个目录项的i节点编号不能指向其他的文件系统,因为在一个文件系统中的i节点编号是从0开始的

8st_atim文件数据的最后访问时间,st_mtim文件数据的最后修改时间,st_ctim i节点最后修改的时间





原文地址:https://www.cnblogs.com/SmileLion/p/5863573.html