APUE学习笔记3——文件和目录
1 简介
之前学习了执行I/O操作的基本函数,主要是围绕普通文件I/O的打开、读或写。下面继续学习Unix文件系统的其他特征和文件的基本性质。我们将从stat函数开始,了解stat结构所代表的文件属性,了解Unix文件系统的结构和符号链接,最后学习对目录进行操作的各个函数。
2 stat、fstat和lstat函数
本章讨论的重点都是围绕着这3个stat函数以及他们返回的信息。
#include <sys/types.h>
#include <sys/stat.h> int stat(const char *pathname, struct stat *buf);
int fstat(int fd, struct stat *buf) ;
int lstat(const char *pathname, struct stat *buf) ;
/*三个函数的返回:若成功则为0,若出错则为-1*/
stat函数返回一个以pathname命名的文件有关的信息结构。
fstat函数返回一个在描述符fd上打开的文件有关信息结构。
lstat函数类似于stat,但但以pathname命名的文件是一个符号链接时,lstat将返回该符号链接本身的相关信息,而不是它指向的文件的相关信息。
第二个参数buf是指针,它指向一个stat的结构体,该结构的实际定义可能随实现而有所不同,但其基本形式是:


该结构中的每一个成员都是基本系统数据类型。
3 文件类型
(1)普通文件(regularfile)。这是最常见的文件类型,这种文件包含了某种形式的数据。至于这种数据是文本还是二进制数据对于内核而言并无区别。对普通文件内容的解释由处理该文件的应用程序进行。
(2)目录文件(directoryfile)。这种文件包含了其他文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有读许可权的任一进程都可以读该目录的内容,但只有内核可以写目录文件。
(3)字符特殊文件(characterspecialfile)。这种文件用于系统中某些类型的设备。
(4)块特殊文件(blockspecialfile)。这种文件典型地用于磁盘设备。系统中的所有设备或者是字符特殊文件,或者是块特殊文件。
(5)FIFO。这种文件用于进程间的通信,有时也将其称为命名管道。
(6)套接口(socket)。这种文件用于进程间的网络通信。套接口也可用于在一台宿主机上的进程之间的非网络通信。第15章将用套接口进行进程间的通信。
文件类型都包含在stat结构中的stat_mode成员中。可在<sys/stat.h>中找到文件类型宏:
| 宏 | 文件类型 |
| S_ISREG() | 普通文件 |
| S_ISDIR() | 目录文件 |
| S_ISCHR() | 字符特殊文件 |
| S_ISBLK() | 块特殊文件 |
| S_ISFIFO() | 管道或FIFO |
| S_ISLNK() | 符号链接 |
| S_ISSOCK() | 套接字 |
4 文件访问权限
与一个进程相关的ID有6个或更多:
| 实际用户ID | 该用户是谁 |
| 实际组ID | |
| 有效用户ID | 文件访问权限 |
| 有效组ID | |
| 附加组ID | |
| 保存的设置用户ID | 由exec函数保存 |
| 保存的设置组ID |
通常,有效用户ID等于实际用户ID,有效组ID等于实际组ID。
设置用户ID位及设置组ID位都包含在st_mode值中,这两位可以用常量S_ISUID和S_ISGID测试。
st_mode值也包含了针对文件的访问权限位。所有文件类型(包括目录文件、字符特别文件等)都有访问权限。
| st_mode屏蔽 | 意义 |
| S_IRUSR | 用户-读 |
| S_IWUSR | 用户-写 |
| S_IXUSR | 用户-执行 |
| S_IRGRP | 组-读 |
| S_IWGRP | 组-写 |
| S_IXGRP | 组-执行 |
| S_IROTH | 其他-读 |
| S_IWOTH | 其他-写 |
| S_IXOTH | 其他-执行 |
我们用名字打开任一类型的文件时,对该名字中包含的每一个目录,包括它可能隐含的当前工作目录都应具有执行权限。
进程每次打开、创建或删除一个文件,内核就进行文件访问权限测试:
- 若进程的有效用户ID是0(超级用户),则允许访问
- 若进程的有效用户ID等于文件所有者ID,
- 进程的有效组ID或附加组ID之一等于文件的组ID,
- 其他用户被设置,
- 那么若适当的访问权限位被设置,则允许访问,否则拒绝访问
APUE学习笔记3——文件和目录的更多相关文章
- APUE 学习笔记(三) 文件和目录
1. 文件类型 文件类型信息包含在 struct stat 里的 st_mode 成员 (1)普通文件,unix内核并不区分文本文件和二进制文件 (2)目录文件,这种文件包含了其他文件的名字以及指向这 ...
- APUE学习笔记3_文件IO
APUE学习笔记3_文件IO Unix中的文件IO函数主要包括以下几个:open().read().write().lseek().close()等.这类I/O函数也被称为不带缓冲的I/O,标准I/O ...
- FAT文件系统规范v1.03学习笔记---4.文件和目录数据区之长目录项
1.前言 本文主要是对Microsoft Extensible Firmware Initiative FAT32 File System Specification中文翻译版的学习笔记. 每个FAT ...
- CentOS学习笔记--基本命令--文件与目录管理
Linux基本命令--文件与目录管理 本节节选自鸟哥的 Linux 私房菜 -- 基础学习篇目录 第七章.Linux 文件与目录管理 ls(文件与目录的检视) ls命令就是list的缩写,ls可以 ...
- linux系统学习笔记:文件、目录、用户
本篇主要从stat函数开始,逐个说明stat结构的每一个成员,以此来了解文件的所有属性.同时将说明修改这个属性的各个函数. 一.文件 使用stat函数族得到和文件有关的信息结构. #include & ...
- 【Linux】Shell学习笔记之四——文件和目录管理(硬连接和软连接)
在这节将要学习linux的连接档,在之前用"ls -l" 查看文件属性的命令时, 其中第二个属性是连接数.那么这个连接数是干什么的?这就要理解inode. 先说一下文件是怎么存储的 ...
- Linux学习笔记05—文件与目录权限
1. 绝对路径与相对路径绝对路径:路径的写法一定由根目录 ‘/’写起,例如 /usr/local/mysql 这就是绝对路径相对路径:路径的写法不是由根目录 ‘/’写起,例如:首先用户进入到/, 然后 ...
- python学习笔记 操作文件和目录
如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操 ...
- Linux System Programming 学习笔记(八) 文件和目录管理
1. 文件和元数据 每个文件都是通过inode引用,每个inode索引节点都具有文件系统中唯一的inode number 一个inode索引节点是存储在Linux文件系统的磁盘介质上的物理对象,也是L ...
随机推荐
- Python笔记1----数据类型
Python数据类型: 整型.字符串.浮点型.布尔型 列表.元祖.字典 1.整型: 范围: 32位机子:-231~231-1. 64位机子:-263~263-1 2.浮点型: ...
- 46.object类型
主要知识点 1.field分类 2.object field类型的存储 一.field类型分类 1.multivalue field { "tags": [ "tag1& ...
- js实现cookie有效期至当次日凌晨
实际开发中有要求用户一些行为每天一次,次日开始重新回复功能,一般前端都是通过cookie来记住用户的操作,然后进行判断当日是否还有机会,这时候需要给存储的cookie值一个有效期,让次日自动失效,重新 ...
- java 反射之获取泛型对象的所有字段与对应的值(包括父类的)
上代码: public static void main(String[] args) throws IntrospectionException { SysUser obj = new SysUse ...
- POJ 2007
直接求凸包,输出即可. #include <iostream> #include <cstdio> #include <cstring> #include < ...
- Scala入门到精通——第一节 Scala语言初步
本节主要内容 Scala简单介绍 为什么要学习Scala Scala语言初步 1. Scala简单介绍 Scala(Scala Language的简称)语言是一种能够执行于JVM和.Net平台之上的通 ...
- Vultr好server不敢独享
Vultr是一家美国2014年成立的新公司.瞬间红遍世界,他是干什么的?他是serverVPS(Virtual Private Server)提供商,这个价格真实惊人的廉价5美金/月.折合人民币30元 ...
- linux高级技巧:rsync同步(二)
1.配置两个节点同步 上个帖子已经展示了同步一个主机的方法.这次我们再加入一个要同步的主机. 方法上并无二质. 1.首先显示我们的控制台: ...
- mysql查询count
Every derived table must have its own alias 每个派生出来的表都必须有一个自己的别名 一般在多表查询时,会出现此错误. 因为,进行嵌套查询的时候子查询出来的的 ...
- Fitnesse安装
Fitnesse安装比较简单 1.确保机器上已经安装了java环境