一、基本结构

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实际组IDpathname描述的文件是否具备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环境高级编程》---文件系统相关推荐

  1. Unix环境高级编程-文件系统详解

    文件系统: 知识性的内容 一.目录和文件 1.获取文件属性 stat,fstat,lstat stat:通过文件路径,获取属性,面对符号链接文件时,获得的是所指向的文件的属性 fstat:通过文件描述 ...

  2. 开发日记-20190822 关键词 读书笔记《Unix环境高级编程(第二版)》《掌控习惯》DAY 2

    Preface 话说,昨天开始尝试着去改变自己,从基础的习惯开始,11:30准时睡觉,平时差不多12:30才睡觉.按理说,比平时早了一个小时睡觉吧,然后我就把闹钟提前了45分钟,想着还能比平常多睡15 ...

  3. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  4. UNIX环境高级编程笔记

    1.setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, len);   SO_REUSEADDR套接口选项允许为以下四个不同的目的提供服务:   ...

  5. 《Unix环境高级编程》学习笔记:从点到面

    以前在课堂上学习过<Unix初级教程(第四版)>,对于Unix有了一点了解.由于以后使用的需要,要对它进行比较深入的学习,为此需要阅读不少的书籍,这本<Unix环境高级编程>便 ...

  6. 《UNIX环境高级编程(第3版)》——2.6 选项

    本节书摘来自异步社区<UNIX环境高级编程(第3版)>一书中的第2章,第2.6节,作者:[美]W. Richard Stevens , Stephen A.Rago著,更多章节内容可以访问 ...

  7. 文件和目录(二)--unix环境高级编程读书笔记

    在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...

  8. Unix环境高级编程 笔记

    Unix环境高级编程(第二版)学习笔记 这是一次较长时间的整理,然而跳跃了一些章节和很多知识点,仍然是很不完善很不全面的. 前言 操作系统某些问题 严格意义上,可将操作系统定义为一种软件,它控制计算机 ...

  9. 《UNIX环境高级编程(第3版)》

    <UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...

  10. UNIX环境高级编程-第三版

    Unix环境高级编程-第三版 之前学习了<Linux系统编程>对于常见的概念和函数都有了基础的认知,这里准备通过这本书,深入学习系统API相关内容.笔记内容会有所倾向,不会严格反应书本内容 ...

最新文章

  1. 学完Web前端后发展方向有哪些呢?
  2. TensorFlow系列(一):TensorFlow是什么
  3. jsonp解决ajax跨域问题,用JSONP解决ajax跨域问题
  4. java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况
  5. Spring注解——使用@ComponentScan自动扫描组件
  6. 关于日志打印的几点建议以及非最佳实践
  7. nj04---事件回调函数
  8. 年龄和收入对数的线性回归_金融计算收益率的时候为什么大部分用对数收益率 (Log Return) 而不是用算数收益率?...
  9. English Reading - Thai cave rescue boys relive 'moment of miracle'
  10. Python提取视频帧图片
  11. 读《人脸自动机器识别》
  12. cesium 粒子特效
  13. android 电池(一):锂电池基本原理篇 .
  14. Java如何连接Redis?
  15. 【JZOJ B组】【NOIP2013模拟】小喵喵的新家
  16. 新版金色UI萝卜影视APP系统源码+Java原生开发
  17. wap商城源码php,ecshop商城源码html5手机wap响应式自适应php网站模板带后端dossy
  18. Linux查看端口号
  19. 利用HttpWebRequest和HttpWebResponse获取Cookie并实现模拟登录
  20. C# 创建barcode 并打印

热门文章

  1. 应用覆盖安装后桌面图标消失问题
  2. 校招----蚂蚁金服测试开发面经
  3. Nginx目录穿越漏洞
  4. tp框架创建新文件夹
  5. android项目开发之多媒体开发
  6. 【visio使用技巧】图片导出pdf时去掉多余空白
  7. java 读取文件 报错 java.io.FileNotFoundException
  8. 【java】求平均值
  9. 51单片机播放音乐(一):蜂鸣器
  10. idea创建web项目运行报404错误_IDEA JavaWeb项目启动运行后出现404错误的解决方法...