笔记整理—内核!启动!—linux应用编程、网络编程部分(4)linux文件属性
linux下文件类型的本质是将一切都视作文件,通过这样的文件系统本质上是简化了系统的难度(开发和使用难度)。
常见的文件;
普通文件->文本文件,是人能看懂的文字类型文件;二进制文件,计算机讷讷感看懂的文件。
目录文件:标注文件夹的内容是一个特殊的文本,包括一些文件的相关信息,本身不适合用普通方式进行读写,可用专用的API进行访问。
设备文件->对应硬件设备,是虚拟文件其中包括字符设备文件、块设备文件,均用特殊API进行访问。
管道文件:一种通信手段。
套接文件:网络相关的文件。
符号链接文件:软链接、硬链接相关。
文件属性获取可用通过stat指令进行获取。文件属性还可以用API进行查看,stat、fstat、lstat。三者返回的都与一个结构体相关struct stat。结构体原型位置在<sys/stat.h>,该结构体包括了能提供的所有文件信息, 其中一项为st_mode,其本质是一个标志位,存储的每一位都有自己的意义,使用S_ISREG()等一列的宏进行解析。
S_ISREG() 是否为普通文件
S_ISDIR() 是否为文件夹
S_ISCHR() 是否为字符文件
S_ISBLK() 是否为块设备文件
S_ISFIFO() 是否为FIFO文件
S_ISLNK() 是否为符号链接
S_SSCCK() 是否为sock文件
均是查看其返回值是否为1进行判断
st_mode还记录了文件的权限,是使用位掩码宏去进行快速查询的。用法比较抽象
result=(buf,st_mode&S_IRUSR)>>8;
用户是否对查询文件有相应读权限。所属组用S_IRGRP,S_IROTH位别的用户。
st_mode本质是一个32位的数,可用专门的宏做掩码进行信息查询。
access函数物理当前用户是否有权限都可以查看权限:F_OK文件是否存在、R_OK文件是否可读、W_OK是否可写、X_OK是否可执行。同样是检查是否返回1
ret=access(name,F_OK);
chmod与fchmod,chmod只有root用户可进行权限修改。
ret=chmod(name,S_IRUSR|S_IWUSR|S_IXUSR);将文件改为可读可写可执行的文件
但是该权限是对user用户而言的,对组和其他用户无效
fchmod是从open中进行权限的修改,chown/fchown/lchown改属主,chgrp/fchgrp改属主组。
umask文件掩码,用于设置新文件的默认权限,umask的权值相加位7,umask 0000所有权限都有,但默认没有x也就是执行,要手动添加。
umask/chmod/chxxx都是API,在man2可查。
opendir/readdir读取目录文件。opendir得到一个DIR指针给readdir使用,readdir调用一次就会返回一个struct,本质是一个目录项,如果有8个文件就要调用八次,readdir不会对内容重复调用返回同一个文件,返回NULL就说明没文件了。
struct dirent *PEnt=NULL;
DIR *pDIr=NULL;
PDir=opendir(name);
PEnt=readdir(PDir);
while(NULL!=PEnt)
{
printf();
PEnt=readdir(PDir);
}
重入函数与不可重入函数,readdir与一般的函数不同,定义一种指针不去分配空间也能用,说明readdir在维护相关指针;readdir不会重复申请内存,多次调用的关联的,是这个函数不可重入;多次调用之间是关联的,这个关联表面这个函数不可重入,不会从头再来,多次调用有因果关系。readdir_r为可重入的版本。