UNIX环境高级编程——第四章

4.2 stat、fstat和lstat函数

#include <sys/types.h>
#include <sys/stat.h>

int stat(const char *pathname, struct stat * buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *pathname, struct stat *buf);
  • 三个函数返回0表示成功,-1表示失败
  • 三个函数的目的都是获取文件相关的信息结构,只不过stat提供的是路径,fstat提供的是文件描述符,lstat的路径是一个符号链接的路径

4.3 文件类型

  1. 普通文件
  2. 目录文件:对一个目录文件具有读许可权的任一进程都可以读该目录的内容,但只有内核可以写目录文件;
  3. 字符特殊文件
  4. 块特殊文件:这种文件典型的用于磁盘设备,系统中的所有设备或者是字符特殊文件,或者是块特殊文件;
  5. FIFO:这种文件用于建承建的通信,有时也将其称为命名管道;
  6. 套接口:这种文件用于进程间的通信
  7. 符号连接

4.4 设置-用户-ID和设置-组-ID

  • 可以在文件方式字(st_mode)中设置一个特殊标志,其定义是“当执行此文件时,将进程的有效用户ID设置为文件的所有者(st_uid)”
  • 在文件方式字中可以设置另一位,它使得执行此文件的进程的有效组ID设置为文件的组所有者

4.5 文件存取许可权

  • st_mode也包含了对文件的存取许可权位

4.6 新文件和目录的所有权

  • 新文件的组ID可以是进程的有效组ID
  • 新文件的组ID可以是它所在目录的组ID

4.7 access函数

  • access函数是按实际用户ID和实际组ID进行存取许可权测试的
  • access函数范围0表示成功,返回-1表示出错
#include <unistd.h>

int access(const char *pathname, int mode);
mode 说明
R_OK 测试读许可权
W_OK 测试写许可权
X_OK 测试执行许可权
F_OK 测试文件是否存在

4.8 umask函数

  • umask函数为进程设置文件方式穿件屏蔽字,并返回以前的值
  • cmask由下表中的9个常数(S_IRUSR,S_IWUSR等)逐位“或”构成
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t cmask)
st_mode屏蔽 意义
S_IRUSR 用户-读
S_IWUSR 用户-写
S_IXUSR 用户-执行
S_IRGRP 组-读
S_IWGRP 组-写
S_IXGRP 组-执行
S_IROTH 其他-读
S_IWOTH 其他-写
S_IXOTH 其他-执行

4.9 chmod和fchmod函数

#include <sys/types.h>
#include <sys/stat.h>
int chmod(const char *pathname, mode_t mode);
int fchmod(int filedes, mode_t mode);

4.10 粘住位

目前不需要了

4.11 chown,fchown和lchown函数

  • 三个函数返回:若成功则为0, 若出错则为-1
#include <sys/types.h>
#include <unistd.h>
int chown(const char *pathname, uid_t owner, gid_t group);
int fchown(int filedes, uid_t owner, gid_t group);
int lchown(const char *pathname, uid_t owner, gid_t group);

4.12 文件长度

  • stat结构的成员st_size包含了以字节为单位的该文件的长度,此字段只对普通文件、目录文件和符号连接有意义

4.13 文件截短

  • 在文件尾端处截去一些数据以缩短文件
  • 将长度截短为0,用O_TRUNC标志做到这一点
  • 两个函数返回:若成功则为0,若出错则为-1
#include <sys/types.h>
#include <unistd.h>
int truncate(const char *pathname, off_t length);
int ftruncate(int filedes, off_t length);

4.14 文件系统

在这里插入图片描述- 注意在图中有两个目录项只想同一i节点:每个i节点中都有一个连接结束,其值是只想该i节点的目录项数,只有当连接技术减少为0时,才可以删除该文件,在stat结构中,连接计数包含在st_nlink成员中,其基本系统数据类型是nlink_t

  • 另外一种连接类型称之为符号连接(symbolic link):我对这种连接的理解就是windows下面的快捷方式
  • i节点包含了所有与文件有关的信息:文件类型、文件存取许可权位、文件长度和指向改文件所占用的数据块的指针等等;stat结构中的大多数信息都取自i节点;

4.15 link,unlink,remove和rename函数

  • 任何一个文件可以有多个目录项只想其i节点,穿件一个向现存文件连接的方法是使用link函数
  • unlink函数可以删除一个现存的目录项
  • remove函数解除对一个文件或目录的连接,对于文件,remove的功能与unlink相同,对于目录,remove的功能与rmdir相同
  • 文件或目录用rename函数更名
#include <unistd.h>
int link(const char *existingpath, const char *newpath);
int unlink(const char *pathname);

#include <stdio.h>
int remove(const char *pathname);
int rename(const char *oldname, const char *newname);

4.17 symlink和readlink函数

  • symlink函数穿件一个符号连接

4.18 文件时间

字段 说明 例子 ls(l)选择项
st_atime 文件数据的最后存取时间 read -u
st_mtime 文件数据的最后修改时间 write 缺省
st_ctime i节点状态的最后修改时间 chmod,chown -c

4.19 utime函数

一个文件的存取和修改时间可以用utime函数更改

4.20 mkidr和rmdir函数

用mkdir函数创建目录, 用rmdir函数删除目录

4.21 读目录

4.22 chdir,fchdir和getcwd函数

  • 进程调用chdir或fchdir函数可以修改当前工作目录
  • getcwd可以获取当前目录

猜你喜欢

转载自blog.csdn.net/u012850592/article/details/103061521