api之文件属性
本篇索引:
1、引言
2、文件类型
3、获取文件属性的函数,stat、fstat、lstat
4、超级用户(root用户)和普通用户
5、进程与用户ID
6、文件权限的检查
7、新创建的的文件和目录的所有权
8、access函数
9、umask函数
10、chmod、fchmod函数
11、粘住位
12、chown,fchown,lchown函数
13、文件长度
14、文件截断函数
15、文件系统概述
16、link,unlink,remove,rename函数
17、符号连接
18、与符号相关的函数,symlink和readlink函数
19、文件的时间
20、mkdir函数和rmdir函数
21、打开目录,读目录等函数
22、chdir、和getcwd函数
23、自己简单实现ls命令
1、引言
上一章通过学习文件io,知道了如何打开文件、对文件进行读写数据等的操作,那么我们这一章将换一个角度,专门围绕文件属性进行相关的讨论。
2、文件类型
之前说过,在Linux下一切皆是文件。应用层看待底层机制时,一切皆以文件的眼光看待,但是底层的机制之间的毕竟是有所不同,根据这些不同,文件也被分为如下几种。
2.1、普通文件(regular file:符号-),其又分为如下两种
a)、文本文件(ascci二进制文件)
b)、二进制文件(纯二进制文件)
对linux内核而言,这两种文件并无区别,具体如何解释均有应用程序说了算。
2.2、目录文件(director file:符号d):一种特殊的文件,用以包含其它文件的文件名字和指向这些
文件对应i节点的节点编号,目录允许读,那么用户就可以读目录文件,但是只有内核可以写目录 文件。
2.3、字符特殊文件(character special file:符号c):对应字符设备。
2.4、块特殊文件(block special file:符号b):对应块设备(如磁盘等)。
2.5、FIFO(符号p):有名管道文件,用于进程间通信,是一种纯软机制。
2.6、套接口(socket:符号s):用于实现跨机进程间的网络通信,当然也可用于实现本地(本机)
进程间的通信。
2.7、符号连接(symbolic link:符号l):用以指向另外一个文件,类似于windos界面下的快捷图标。
所有的这些文件中,普通文件数量最多,最常见,其次是目录文件。
3、获取文件属性的函数,stat、fstat、lstat
3.1、函数原型
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
3.2、函数功能
获取文件的属性信息,文件的属性信息存在了磁盘上该文件对应的inode(i结点)结点中,但
是open打开文件时又会从磁盘i节点中复制一份到内存v节点中i节点结构中,这三个函数还
是有一些区别的。
a)、stat:利用文件路径名从磁盘上的i节点中读取文件属性到buf结构体中。
b)、fstat:前提是文件已经打开,利用文件描述符直接从v结点中的i结点结构中读出文件的属
性,该函数直接从内存中读,但是stat直接从磁盘读取。
c)、lstat:如果操作的文件是符号连接文件时,直接读取的是符号连接文件的属性信息,而stat
和fstat读的是符号连接文件指向文件的属性。所以我们说stat和fstat是一个符号跟随的函 数,而lstat不是。有关符号跟随的问题后面将再次讲解。
3.4、参数说明
a)、const char *path:文件路径名。
b)、int fd:文件描述符。
c)、struct stat *buf:存放读出的文件属性信息。
3.4.1、struct stat *buf结构体说明
struct stat {
dev_t st_dev; /* 块设备号 */
ino_t st_ino; /* inode结点号 */
mode_t st_mode; /* 文件类型和文件权限*/
nlink_t st_nlink; /* 链接数 */
uid_t st_uid; /* 文件所属用户ID*/
gid_t st_gid; /* 文件所属组ID */
dev_t st_rdev; /* 字符设备ID */
off_t st_size; /* 文件大小 */
blksize_t st_blksize; /* 系统每次按块Io操作时,块的大小(一般是512或1024) */
blkcnt_t st_blocks; /* 块的索引号 */
time_t st_atime; /* 最后一次访问时间,如read*/
time_t st_mtime; /* 最后一次修改时间 */
time_t st_ctime; /* 最后一次状态修改的时间,如权限,所有者的修改 */
};
以上这些结构体成员专门用来存放文件的相关属性,囊括了我们讲的7种文件,但是每种类型的文件都不会全用上这些成员项。比如说块设备文件用了块设备ID st_dev后,就不会使用字符设备ID st_rdev,又如文件的大小只有普通文件和目录才有,其它文件是没有的。
3.4.2、st_uid、st_gid
st_uid:文件所属用户ID
st_gid:文件所属组ID
3.4.3、st_mode
st_mode其实是unsigned short(被typedef为了mode_t)的类型,包含了文件类型、设置位和文件权限,看下图:
这些宏使用起来并不是很方便,我们知道了这些宏实现的原理后,大可自己按照这个方法操作,不必一定要使用这些宏。
如果大家忘记了这些宏的话,可在linux下执行man 2 stat,手册中对这些宏有详细的说明。
3.4.4、ls -al看到的文件权限
7种文件决大部分属性是相同的,但是每种不同的文件都有自己独特的属性,这些属性都是stat函数从磁盘中读到了struct stat结构体中,ls -al的目的就是把struct stat结构体描述共有属性显示出来,我们下面以普通文件为例进行说明。
我们执行ls -al main
3.5、返回值
调用成功,返回0,失败返回-1,errno被设置。
3.6、测试用例
3.6.1、stat和lstat函数
事先在当前路径下touch一个file的普通文件,然后调用stat函数获取文件属性。
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/61420.html