《Unix环境高级编程》---文件系统
一、基本结构
Unix的所有文件信息可以用如下结构来存储,这是内核定义的数据结构:
struct stat {mode_t st_mode; /* 文件类型、访问权限位 */ino_t st_ino; /* i节点 */dev_t st_dev; /* 文件所在设备的主、次设备号 */dev_t st_rdev; /* 特殊设备的设备号(字符特殊设备、块特殊设备才有) */nlink_t st_nlink; /* 链接数 */uid_t st_uid; /* 文件所有者ID */gid_t st_gid; /* 文件所属组ID */off_t st_size; /* 字节大小(普通文件才有)*/struct timespec st_atime; /* 上次访问时间 */struct timespec st_mtime; /* 上次修改时间 */struct timespec st_ctime; /* 上次文件状态更改时间 */blksize_t st_blksize; /* 最佳I/O块大小 */blkcnt_t st_blocks; /* 分配的磁盘块数 */
}struct timespec {// ...// 其他字段// ...time_t tv_sec; /* 秒 */long tv_nsec; /* 纳秒 */
}
二、基本函数
1.文件属性
int stat(const char *pathname, struct stat *buf);
通过指定文件名获取文件属性于缓冲区中,如果是符号链接,则获取其链接的文件的文件属性。
int fstat(int fd, struct stat *buf);
通过文件描述符获取文件属性于缓冲区中。
int lstat(const char *pathname, struct stat *buf);
与stat相同,但是如果文件是符号链接,则获取其本身的文件属性。
int fstatat(int dirfd, const char *pathname, struct stat *buf, int flags);
为相对于dirfd目录的路径名pathname返回文件统计信息。
- flags取值可以是:
- AT_EMPTY_PATH:如果pathname是空串,则返回dirfd的文件统计信息,此时dirfd可以是文件。
- AT_NO_AUTOMOUNT:如果pathname是自动挂载点目录,将不自动挂载,只统计文件信息。
- AT_SYMLINK_NOFOLLOW:如果pathname是符号链接,则不跟随符号链接。
2.文件权限
int access(const char *pathname, int mode);
int faccessat(int dirfd, const char *pathname, int mode, int flags);
测试实际用户ID和实际组ID对pathname描述的文件是否具备mode描述的权限。
- flags参数取值为AT_EACCESS时,
faccessat()
函数测试使用的是调用进程的有效用户ID和有效组ID。 - mode参数的取值可以是:R_OK(读)、W_OK(写)、X_OK(执行)。
mode_t umask(mode_t mask);
把权限掩码设置为指定值。
int chmod(const char *pathname, mode_t mode);
int fchmod(int fd, mode_t mode);
把指定文件的权限修改为mode描述的权限。
3.文件归属
int chown(const char *pathname, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *pathname, uid_t owner, gid_t group);
修改指定文件的所有者和所属组。
- 当pathname描述的文件是符号链接时,chown() 函数会取消引用,而 lchown() 不取消引用。
4.文件截断
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
把指定文件长度截断为length。
- 如果文件的原长度大于length,则超过length的部分就不再能访问了。
- 如果文件的原长度小于length,则文件长度将增加。
5.链接
int link(const char *oldpath, const char *newpath);
创建指定文件的一个硬链接。
int unlink(const char *pathname);
解除指定的硬链接,如果文件的硬链接数降为0,则文件将从磁盘上删除。
int symlink(const char *actualpath, const char *sympath);
为指定目录项创建一个符号链接。
6.创建/删除目录
int mkdir(const char *pathname, mode_t mode);
以指定权限和路径名创建一个目录。
int rmdir(const char *pathname);
删除指定目录。
7.修改读写时间
int utimes(const char *filename, const struct timeval times[2]);
修改指定文件的最后一次读写时间。
- times[2]:最近一次读的时间和写的时间。
8.查找路径
int glob(const char *pattern, int flags, int (*errfunc) (const char *epath, int eerrno), glob_t *pglob);
查找与指定模式匹配的路径名,保存到给定的glob_t类型对象中。
void globfree(glob_t *pglob);
释放glob()动态分配的内存。
9.工作路径
char *getcwd(char *buf, size_t size);
把当前进程的工作路径保存到大小指定的缓冲区并返回路径名。
int chdir(const char *path);
int fchdir(int fd);
更改当前进程的工作路径到指定路径。
int chroot(const char* path);
更改当前进程的根目录。
三、文件类型判断
文件类型信息包含在stat
结构的st_mode
成员中,用以下的宏可以确定文件类型,这些宏的参数都是stat
结构的st_mode
成员:
S_ISREG() /* 普通文件 */
S_ISDIR() /* 目录文件 */
S_ISCHR() /* 字符特殊文件 */
S_ISBLK() /* 块特殊文件 */
S_ISFIFO() /* 管道或FIFO */
S_ISLNK() /* 符号链接 */
S_ISSOCK() /* 套接字 */
《Unix环境高级编程》---文件系统相关推荐
- Unix环境高级编程-文件系统详解
文件系统: 知识性的内容 一.目录和文件 1.获取文件属性 stat,fstat,lstat stat:通过文件路径,获取属性,面对符号链接文件时,获得的是所指向的文件的属性 fstat:通过文件描述 ...
- 开发日记-20190822 关键词 读书笔记《Unix环境高级编程(第二版)》《掌控习惯》DAY 2
Preface 话说,昨天开始尝试着去改变自己,从基础的习惯开始,11:30准时睡觉,平时差不多12:30才睡觉.按理说,比平时早了一个小时睡觉吧,然后我就把闹钟提前了45分钟,想着还能比平常多睡15 ...
- (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- UNIX环境高级编程笔记
1.setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, len); SO_REUSEADDR套接口选项允许为以下四个不同的目的提供服务: ...
- 《Unix环境高级编程》学习笔记:从点到面
以前在课堂上学习过<Unix初级教程(第四版)>,对于Unix有了一点了解.由于以后使用的需要,要对它进行比较深入的学习,为此需要阅读不少的书籍,这本<Unix环境高级编程>便 ...
- 《UNIX环境高级编程(第3版)》——2.6 选项
本节书摘来自异步社区<UNIX环境高级编程(第3版)>一书中的第2章,第2.6节,作者:[美]W. Richard Stevens , Stephen A.Rago著,更多章节内容可以访问 ...
- 文件和目录(二)--unix环境高级编程读书笔记
在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...
- Unix环境高级编程 笔记
Unix环境高级编程(第二版)学习笔记 这是一次较长时间的整理,然而跳跃了一些章节和很多知识点,仍然是很不完善很不全面的. 前言 操作系统某些问题 严格意义上,可将操作系统定义为一种软件,它控制计算机 ...
- 《UNIX环境高级编程(第3版)》
<UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...
- UNIX环境高级编程-第三版
Unix环境高级编程-第三版 之前学习了<Linux系统编程>对于常见的概念和函数都有了基础的认知,这里准备通过这本书,深入学习系统API相关内容.笔记内容会有所倾向,不会严格反应书本内容 ...
最新文章
- 学完Web前端后发展方向有哪些呢?
- TensorFlow系列(一):TensorFlow是什么
- jsonp解决ajax跨域问题,用JSONP解决ajax跨域问题
- java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况
- Spring注解——使用@ComponentScan自动扫描组件
- 关于日志打印的几点建议以及非最佳实践
- nj04---事件回调函数
- 年龄和收入对数的线性回归_金融计算收益率的时候为什么大部分用对数收益率 (Log Return) 而不是用算数收益率?...
- English Reading - Thai cave rescue boys relive 'moment of miracle'
- Python提取视频帧图片
- 读《人脸自动机器识别》
- cesium 粒子特效
- android 电池(一):锂电池基本原理篇 .
- Java如何连接Redis?
- 【JZOJ B组】【NOIP2013模拟】小喵喵的新家
- 新版金色UI萝卜影视APP系统源码+Java原生开发
- wap商城源码php,ecshop商城源码html5手机wap响应式自适应php网站模板带后端dossy
- Linux查看端口号
- 利用HttpWebRequest和HttpWebResponse获取Cookie并实现模拟登录
- C# 创建barcode 并打印