加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

unix文件和目录

发布时间:2022-10-13 00:03:33 所属栏目:Unix 来源:网络
导读: 文件系统是存储数据的基础,对于一个操作系统来说至关重要,unix支持多种文件系统,各文件系统的特性有所不同,但是又万变不离其宗。
unix文件分为以下几种:
普通文件:最常用的文件类型,

文件系统是存储数据的基础,对于一个操作系统来说至关重要,unix支持多种文件系统,各文件系统的特性有所不同,但是又万变不离其宗。

unix文件分为以下几种:

普通文件:最常用的文件类型,包含了某种形式的数据。可以是ascII的文本文件和可执行的二进制文件,具体是那种文件由内核识别。

目录文件:一个包含了其他文件的名字以及指向这些文件有关信息的指针

块特殊文件:提供对于设备的带缓冲的以固定长度为单位进行的访问

字符特殊文件:提供对于设备的不带缓冲的访问,长度可变

FIFO文件:用于进程间通信,也称为管道

套接字:用于进程间网络通信,也可用于单机进程间通信

符号链接:指向另外一个文件

unix系统提供了四个函数用于获取文件有关信息:

int stat(const char * restrict pathname,struct stat *restrict buf);

int fstat(int fd ,struct stat *buf);

int lstat(const char * restrict pathname,struct stat *restrict buf);

int fstatat(int fd, const char * restrict pathname, struct stat *restrict buf, int flag);

stat函数:pathname用于指定文件绝对路径,buf结构用于返回有关文件的信息,碰到符号链接时,返回符号链接所指文件的相关信息

fstate函数:fd为一个已经打开的文件描述字,buf用于返回fd所关联的文件的有关信息

lstat函数:功能与stat函数类似,但是如果文件是一个符号链接,buf中返回的是有关此符号链接的信息,而不是符号链接所指文件的有关信息

fstatat函数:fd为一个已经打开的文件描述字,pathname为相对于在fd上打开的文件的路径,flag参数控制对于符号链接的处理方式,buf用于返回文件的相关信息

设置用户ID与设置组ID用于控制可执行文件在执行时的权限限制。

设置用户ID:如此位被设置,当非所有者用户在执行程序文件时,在程序执行期间该用户将会获得文件所有者的权限

设置组ID:如果此位被设置,当非组所有者用户在执行程序文件时,在程序执行期间该用户将会或者文件组所有者的权限

当进程打开、创建、删除一个文件时,内核就进行文件访问权限测试,具体分为四步:

1.如果进程的有效用户ID是0(超级用户),那么允许访问整个文件系统

2.如果进程的有效用户ID是文件所有者ID,那么根据文件所有者的访问权限进行检测

3.如果进程的有效组ID或者附属组ID之一等于文件的组ID,那么根据文件的组所有者权限进行检测

4.如果为其他用户,那么根据其它用户的权限进行检测

注:如果进程拥有文件,则检测文件所有者访问权限,不检查组所有者访问权限,如果进程属于某个文件组所有者,那么检测文件组所有者的访问权限,不检测其他用户的访问权限。

进程创建文件时,新文件的所有者ID被设置为进程有效用户ID,组所有者ID可能被设置为进程的有效组ID,也可能是文件所在目录的组所有者ID

access和faccessat函数:

access函数:用于检测文件的访问权限,采用进程的实际用户ID和实际组ID

faccessat函数:与faccessat函数类型,可以控制文件路径为相对路径,并且可以控制是根据进程的有效用户ID和有效组ID还是进程的实际用户ID和实际组ID来测试文件访问权限

(注:为突出操作系统的核心设计思想,而非API的调用,以后的函数皆只指出函数名(要用到时可及时查询)以及函数功能(便于选择使用函数))

umask设置文件模式创建屏蔽字

umask的参数为一个八进制数串,对应文件的所有者、组所有者、其他用户的屏蔽权限,例如002表示屏蔽其他用户的写权限。

chmod、fchmod、fchmodat函数可用于更改文件的访问权限,其共有四个参数,fd,pathname,mode,flag(有些函数只有其中几个)

chmod函数:在pathname指定路径的文件上进行操作,mode用于指定文件权限

fchmod函数:对fd上打开的文件进行操作,参数不是路径名,而是文件描述字,mode用与指定文件权限

fchmodat函数:可以根据相对路径名指定文件,根据flag指定对于符号链接的操作方式,mode用于指定文件权限

注:mode是文件权限常量的按位或组合,也可取自struct stat结构中的st_mode成员,故而此三个改变文件权限的函数通常与文章开头的三个获取文件信息的函数结合使用。

如果创建文件的组ID不是进程所属的组,那么关闭文件的设置组ID位

如果进程没有超级权限,那么关闭文件的粘着位。

有关粘着位,来自于unix的演化进程,最开始的操作系统没有分页技术,为了加快程序执行速度,当设置了粘着位的程序文件第一次被执行时并终止时,正文指令部分将会被存在交换区,以便下一次程序执行时能快速装载入内存。如今的系统拓展了粘着位的适用范围,单一unix规范允许针对目录设置粘着位,只有对该目录拥有写权限并且满足以下三个条件之一才能在该目录下重命名或者删除文件:

1.用户是要修改的文件的所有者

2.用户是此目录的所有者

3.用户拥有超级用户权限

更改文件权限的四个函数:chown、fchown、fchownat、lchown。四个函数的不同之处在于处理不同的文件路径,符号链接或者符号链接指向的文件,具体用法以及注意事项可以在使用的时候再进行查询

文件的长度可以为0,表示没有内容。有时候文件长度并不能实际的反映文件的内容的多少,因为普通文件中可能存在空洞,由于在写文件时unix系统文件,设置的文件偏移量超过了文件尾端并且写入了数据,那么中间便会留下一片空洞,导致文件的长度大于文件所占用的实际磁盘空间。在进行文件复制时,未写过的空洞处将会被读成0。文件可以进行截断,有两个函数可以阶段文件,分别是truncate、ftruncate,如果文件长度大于截断后的长度,那么多出的部分数据将不能被访问,如果文件长度小于所设置的截断长度,那么文件长度将会被拓展为截断长度,原来的尾端到截断后的尾端之间填充0。

关于unix文件系统最核心的便是i结点和node结点,i结点用于存储文件的各种信息,node结点用于存放文件的具体内容,对于普通文件来说,具体内容是一些文本数据或者二进制数据,对于目录来说,文件内容便是目录中的文件名和对应的i结点编号。一般来说空目录下也有两项文件是必不可少的,一项是当前目录“·”,另一项是上一级目录“··”。另外需要注意的就是硬链接和符号链接的区别,硬链接是直接创建一个文件项,与原来的文件项名字不同,但是对应的i结点编号相同。符号链接是新建一个文件项,名字和i结点编号是全新的,i结点指示的数据块里存有原文件的文件名以及i结点编号。

有两个函数可用于创建对于文件的链接,分别是link、linkat

三个函数可用于删除对于文件的链接分别是unlink、unlinkat、remove(如文件没有其他链接,则删除文件)

各个函数功能有相似之处也有不同的地方,具体用法待用到时再详细探讨

为目录或者文件重命名可以使用rename函数与renameat函数,两者区别主要在于文件路径表示方法不同,ranameat允许相对路径指定文件。

创建符号链接函数:synlink、synlinkat

读取符号连接函数:readlink、readlinkat

unix中对于文件和目录进行操作的函数通常都有两份,一份针对绝对路径,一份针对相对路径。

unix系统为文件维护三个时间:最后访问时间、最后更改内容时间、最后更改状态时间,以上所列举的和以后将会列举的函数或多或少会改变这三个时间中的一种或者几种。系统通常根据最后访问时间进行资源清理。一个文件的访问和修改时间可以用以下几个函数修改:

futimens(需要打开文件)、utimesat(直接使用文件名)、utimes

以上函数的调用需要一定的权限,根据参数的不同需要不同的权限。所有的函数不能对状态更改时间指定一个值,因为调用此类函数的过程中,文件的状态会被改变。

用于创建目录的两个函数:mkdir(绝对路径)、mkdirat(可指定相对路径)

用于删除目录的函数:rmdir(使目录的链接计数设为0,unix系统中删除一个文件的方法是使其链接计数为0,此时操作系统释放文件占用的资源,如果有进程正在使用,那么在进程关闭后释放,对于删除空目录来说,如果有进程正在使用此目录,那么进程不能创建新文件)

unix系统提供了一套有关目录操作的例程,包括打开目录读取目录信息的多个函数。shell中的读取目录、列出文件、查找文件等程序大都是调用此类函数。

chdir(将跟随符号链接,作用于路径)、fchdir(作用于文件描述符)用于更改当前工作目录,当前工作目录属于进程属性,用户起始目录属于用户属性,两者有所区别。每个进程的当前工作目录是独立不受影响的,所以即便我们在shell中运行程序改变当前工作目录,当程序运行完毕时shell还是停留在之前的目录,因为shell也是一个进程,它的当前工作目录不受其它进程影响,所以shell拥有内建命令cd以改变当前工作目录。getcwd函数可以获取当前工作目录。

对于快设备特殊文件,系统提供了两个宏major和minor分别访问主次设备号,至此设备号放在stat所返回的结构的dec_t对象中

了解unix文件系统对于unix编程至关重要,unix系统所提供的对于文件以及目录的操作主要围绕stat函数返回结构中的各个成员设定。笔者对于文件系统以及各类函数只有一个粗浅的了解,在以后实践的过程中还将不断地加深认识。

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!