APUE3笔记-第四章 文件和目录

1 文件:文件属性控制

    1.1 stat数据结构 fstat

    1.2 文件类型 (mode_t st_mode)

    1.3 UID、GID、访问权限 access chmode chown create unmask

    1.4 文件大小 turncate

2 目录

    2.1 unix文件系统

    2.3 修改时间 futimens

    2.4 目录操作

注意


1 文件:文件属性控制

    1.1 stat数据结构 fstat

struct stat {
    mode_t            st_mode; /* file type & mode (permissions) */
    ino_t             st_ino; /* i-node number (serial number) */
    dev_t             st_dev; /* device number (file system) */
    dev_t             st_rdev; /* device number for special files */
    nlink_t           st_nlink; /* number of links */
    uid_t             st_uid; /* user ID of owner */
    gid_t             st_gid; /* group ID of owner */
    off_t             st_size; /* size in bytes, for regular files */
    struct timespec   st_atim; /* time of last access */
    struct timespec   st_mtim; /* time of last modification */
    struct timespec   st_ctim; /* time of last file status change */
    blksize_t         st_blksize; /* best I/O block size */
    blkcnt_t          st_blocks; /* number of disk blocks allocated */
};

    可以通过fstat获取文件的stat数据结构,获取文件的所有属性,当然也可以对这些值进行设置。不同于第3章中文件在状态标志,文件状态标志涉及的是进程对打开的文件能执行的操作;而文件的属性包括的是一些更基本的内容,包括文件的类型,文件的所有者,文件大小、修改时间等等...

    1.2 文件类型 (mode_t st_mode)

      文件类型有:普通文件、目录文件、链接; 块设备文件、字符设备文件;FIFO、SOCKET。

可能使用 S_ISREG类似的宏来判断一个文件的类型。我们常见的普通文件,目录文件和链接。FIFO、SOCKET是进程间用来通信的数据结构,在UNIX中也是用文件这一概念来实现的。块设备文件和字符设备文件对应的是外接设备的驱动程序在内核中注册的文件,类如显卡、打印机,我们可以通过驱动程序注册的这些文件与外接设备进行通信和数据交换。

    1.3 UID、GID、访问权限 access chmode chown create unmask

      Unix是一个多用户系统,多个用户可以同时登录操作系统进行工作。操作系统要为每一个用户分配一定的资源,包括磁盘,内存,cpu使用时间。也要给不同的用户分配不同的权限来对资源的访问进行控制。文件是一种资源,所以他也有一些与用户相关的信息需要保存和在访问时进行控制。进程有实际用户ID和组ID、有效用户ID和组ID、保存的用户ID和组ID。

      access:每一个文件有一个文件拥有者ID,文件拥有者所在组ID,对于用户、同组用户、其它用户,文件分别有读写和执行权限的控制,对st_mode使用宏S_IRUSR...判断不同用户的读写权限。也可使用access直接测试当前进程是否具有文件的读写权限。chmode:设置文件对于不同身份用记的访问权限,需要当前进程具有相应权限才能成功。chown: 可以修改文件所有者的身份,同组的用户相应的也更新了。

      对于进程新创建的文件,可以在创建时设置访问权限create,C语言也提供unmask在访问权限设置时直接屏敝相应的权限,具有可参考 shell chmod 777命令的解析。

    设置用户ID、设置组ID可以使进程(进程是由程序而来,程序先由编译器编译成相应格式的文件后保存在磁盘里)具有文件所有者的ID和文件所有者所在组的ID。

    1.4 文件大小 turncate

      truncate可以直接设置文件在大小,当length大于当前文件大小时,文件出现空洞,类似于用0对文件进行填充,但文件系统一般会记录空洞的位置,空洞实际不占用磁盘空间。可以用lseek查找文件中空洞的位置。

 

2 目录

    2.1 unix文件系统

       文件系统都使用目录结构来组织文件,Unix文件系统从一个根目录开始'/',用树状结构展开。每一个目录也是一个文件,目录文件中记录的是文件的I-node信息。这样在文件系统的目录结构里面,一个普通文件就是一个叶子节点,一个目录文件就是个中间节点,目录文件里的一条条记录就是从当前节点发出的一条条树枝,将当前节点链接到另外一个文件。

      硬链接:就是目录文件里面的一条条记录,可以使用link unlink创建和删除这样一条记录。rename remove 也可以说是改变目录结构,实际上是操作文件系统里面的目录项,修改一个或二个目录项来改变文件的访问路径。并不改变文件在磁盘中的实际位置。

      软链接:为一个文件创建一个新的i-node对象,并且为他创建一个硬链接,使得能够通过目录结构找到它。symlink

    2.3 修改时间 futimens

      访问时间+修改时间,可以设置文件的访问时间和修改时间,具体参考的设置参考手册。文件还有一个状态更改时间,在调用函数时会自动修改,进程无法进行设置。访问时间指访问文件的内容,访问文件的状态信息stat ls不会修改访问时间,修改时间也指修改文件的内容,如果修改和文件访问权限,硬链接数...对应的是文件的状态修改时间。

    2.4 目录操作

      mkdir rmdir:  创建目录,给定目录的路径,在目录路径下创建新的目录,新创建的目录也是一个文件,所以需要给定文件的访问权限,当然unmask访问权限屏敝字也会工作。rmdir只能删除空目录,空目录下只有 . ..这两个创建新目录进自动创建的目录文件,rmdir要做的工作也是将指向当前目录的硬链接删除,当没有硬链接指向当前目录了,那么就可以将当前目录文件从磁盘上删除。创建硬链接时有提到不能创建指向目录的硬链接,这里说的硬链接指的是内核里实现目录结构实际用的是硬链接的形式,内核可以使用创建目录硬链接的接口,但用户进程不可以。用户进程只能调用创建新目录的接口,这个新目录的路径能够给定,可以保证目录路径不存在环。

      opendir readdir closedir:  对于目录文件,是操作系统自己需要支持的一种文件格式,所以他提供了处理目录文件的接口,像普通文件一样先打开文件,得到一个DIR* 的结构体,使用readdir可以读取目录下的一个新的文件的信息,返回的是一个struct dirent *的结构体,常用的有 dirp->name这一个属性。读取文件完成后需要关闭目录文件。

      chdir getcwd:  进程有一个当前工作目录,用于文件处理的函数经常要提供文件的路径,文件路径可以使用绝对路径,就是从'/'开始的,也可以使用相对路径,相对路径的相对值就是当前工作目录,可以使用chdir修改进程的当前工作目录,也可以使用getcwd获取当前的工作目录(返回的一个文件路径,用字符串表示)。

 

注意

      上面提到的好多函数,有一个加后缀at的版本,或加前缀f的版本。例如chmode、fchmode;stat、fstat、fstatat。

前缀f表示:使用文件描述符来给定要操作的文件对象,而不是使用文件路径的方式。

后缀at表示:在需要提供文件路径时,使用相对路径,相对值不是进程的当前工作目录,而是给定一个文件描述符。意思是这次文件操作的文件的路径是相对于给定的文件描述符对应的文件目录产生的。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值