第四章 文件和目录
1、函数stat、fstat、fstatat和lstat
#include<sys/stat.h>
Intstat(const char *restrict pathname,struct stat *restrict buf);
Intfstat(int fd,struct stat *buf);
Intlstat(const char *restrict pathname,struct stat *restrict buf);
Intfstatat(int fd,const char *restrict pathname,struct stat *restrict buf,intflag);
返回值:若成功,返回0;若出错,返回-1。
stat函数能根据pathname得到以此name命名的文件的信息结构。
lstat能够根据pathname得到以此name命名的连接文件的信息结构。lstat列出的是符号连接文件本身,而不是连接引用的文件。用途:需要以降序遍历目录层次结构时。
fstatat根据文件描述符得到相应文件的信息结构。
fstatat函数操作的函数为:由fd参数指向的相对于当前打开目录的路径名,返回文件统计信息。
struct stat {
dev_t st_dev; //文件的设备编号
ino_t st_ino; //节点
mode_t st_mode; //文件的类型和存取的权限
nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1
uid_t st_uid; //用户ID
gid_t st_gid; //组ID
dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号
off_t st_size; //文件字节数(文件大小)
unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小)
unsigned long st_blocks; //块数
time_t st_atime; //最后一次访问时间
time_t st_mtime; //最后一次修改时间
time_t st_ctime; //最后一次改变时间(指属性)
};
2、函数access和faccessat
按实际用户ID和实际组ID进行访问测试访问能力。
#include<unistd.h>
Int access(const char *pathname,intmode);
Int faccessat(int fd, const char*pathname,int mode,int flag);
返回值:若成功,返回0,若失败,返回-1.
两个函数在下面两种情况下是相同的:一种是pathname参数为绝对路径,另一种是fd参数取值为AT_FDCWD而pathname参数为绝对路径;否则faccessat计算相对于打开目录的pathname。
3、函数umask
函数umask为进程设置文件模式创建屏蔽字,并返回之前的值。
#include<sys/stat.h>
mode_tumask(mode_t mode);
返回值:之前的文件模式创建屏蔽字。
在文件模式创建屏蔽字中为1的位,在文件mode中的相应位一定被关闭。
示例:umask(0001);禁止其他执行;
4、函数chmod、fchmod和fchmodat
这三个函数可以使我们更改现有文件的访问权限
#include<sys/stat.h>
Int chmod(constchar *pathname,mode_t mode);
Int fchmod(intfd,mode_t mode);
Int fchmodat(intfd,const char *pathname,mode_t mode,int flag);
返回值:若成功,返回0;若出错,返回-1.
函数chmod在指定的文件上进行操作,fchmod函数则对已打开的文件进行操作;fchmodat与chmod函数类似(绝对/相对路径名)
宏定义 |
值 |
说明 |
S_ISUID |
04000 |
设置用户权限 |
S_ISGID |
02000 |
设置组用户权限 |
S_ISVTX |
01000 |
设置sticky位 |
S_IRUSR |
00400 |
文件所有者的读权限 |
S_IWUSR |
00200 |
文件所有者的写权限 |
S_IXUSR |
00100 |
文件所有者的执行权限或目录搜索权限 |
S_IRGRP |
00040 |
组用户的读权限 |
S_IWGRP |
00020 |
组用户的写权限 |
S_IXGRP |
00010 |
组用户的执行权限或目录搜索权限 |
S_IROTH |
00004 |
其他用户的读权限 |
S_IWOTH |
00002 |
其他用户的写权限 |
S_IXOTH |
00001 |
其他用户的执行权限和目录搜索权限 |
示例:chmod( path, 0700) ;
5、函数chown、fchown、fchownat和lchown
下面几个函数可用于更改文件的用户ID和组ID。如果两个参数owner或group中的任意一个是-1,则对应的ID不变。
#include<unistd.h>
Int chown(const char*pathname,uid_t owner,gid_t group);
Int fchown(int fd,uid_towner,gid_t group);
Int fchownat(int fd,const char*pathname,uid_t owner,gid_t group,int flag);
Int lchown(const char*pathname,uid_t owner,gid_t group);
返回值:若成功,返回0;若出错,返回-1.
除了所引用的文件是符号链接以外,这四个函数的操作类似。在符号链接情况下,lchown和fchownat更改符号连接本身的所有者,而不是该符号链接所指向的文件的所有者。
6、文件系统
https://blog.csdn.net/men_wen/article/details/52972678
传统的UNIX系统V文件系统,可以将一个硬盘分为多个分区,每个分区可以包含一个文件系统
i节点是固定长度的记录项,包含有关文件的信息。
7、函数link、linkat、unlink、unlinkat和remove
任何一个文件可以有多个目录项指向其i节点。创建一个指向现有文件的连接的方法是使用link函数或linkat函数。
#include<unistd.h>
Intlink(const char *existingpath,const char *newpath);
Int linkat(intfd,const char *existingpath,int nfd,const char *newpath,int flag);
两个函数返回值:若成功,返回0;若出错,返回-1.
这两个函数创建一个新目录项,它引用现有文件existingpath。
为了删除一个现有的目录项,可以调用unlink函数。
#include<unistd.h>
Int unlink(constchar *pathname);
Int unlinkat(intfd,const char *pathname,int flag);
两个函数返回值:若成功,返回0;若出错,返回-1.
这两个函数删除目录项,并将有pathname所引用文件的链接计数减1.只有当链接计数达到0时,该文件的内容才可被删除。
也可以用remove函数解除对一个文件或目录的链接,对于文件,其功能与unlink相同,对于目录,其功能与rmdir相同
#include<stdio.h>
Int remove(constchar* pathname);
8、函数rename和renameat
文件或目录可以用rename或者renameat函数进行重命名。
#include<stdio.h>
Int rename(constchar *oldname,const char *newname);
Int renameat(intoldfd,const char *oldname,int newfd,const char *newname);
两个函数返回值:若成功,返回0;若失败,返回-1
9、函数mkdir、mkdirat和rmdir
用mkdir和mkdirat函数创建目录,用rmdir删除目录。
#include<sys/stat.h>
Int mkdir(constchar *pathname,mode_t mode);
Int mkdirat(intfd,const char *pathname,mode_t mode);
两个函数返回值:若成功,返回0;若出错,返回-1.
#include<unistd.h>
Int rmdir(constchar *pathname);
返回值:若成功,返回0;若出错,返回-1.
10、函数chdir、fchdir和getcwd
进程调用chdir或fchdir函数可以更改当前工作目录。
#include<unistd.h>
Int chdir(constchar *pathname);
Int fchdir(intfd);
两个函数返回值:若成功,返回0;若出错,返回-1.
在两个函数中,分别用pathname或打开文件描述符来指定新的当前工作目录。
示例:chdir(“/tmp”);
函数getcwd可以得到当前工作目录完成的绝对路径名。
#include<unistd.h>
char *getcwd(char*buf,size_t size);
返回值:若成功,返回buf;若出错,返回NULL。
两个参数,一个是缓冲区地址buf,另一个是缓冲区长度。