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——文件和目录的更多相关文章

  1. APUE 学习笔记(三) 文件和目录

    1. 文件类型 文件类型信息包含在 struct stat 里的 st_mode 成员 (1)普通文件,unix内核并不区分文本文件和二进制文件 (2)目录文件,这种文件包含了其他文件的名字以及指向这 ...

  2. APUE学习笔记3_文件IO

    APUE学习笔记3_文件IO Unix中的文件IO函数主要包括以下几个:open().read().write().lseek().close()等.这类I/O函数也被称为不带缓冲的I/O,标准I/O ...

  3. FAT文件系统规范v1.03学习笔记---4.文件和目录数据区之长目录项

    1.前言 本文主要是对Microsoft Extensible Firmware Initiative FAT32 File System Specification中文翻译版的学习笔记. 每个FAT ...

  4. CentOS学习笔记--基本命令--文件与目录管理

    Linux基本命令--文件与目录管理 本节节选自鸟哥的 Linux 私房菜 -- 基础学习篇目录  第七章.Linux 文件与目录管理  ls(文件与目录的检视) ls命令就是list的缩写,ls可以 ...

  5. linux系统学习笔记:文件、目录、用户

    本篇主要从stat函数开始,逐个说明stat结构的每一个成员,以此来了解文件的所有属性.同时将说明修改这个属性的各个函数. 一.文件 使用stat函数族得到和文件有关的信息结构. #include & ...

  6. 【Linux】Shell学习笔记之四——文件和目录管理(硬连接和软连接)

    在这节将要学习linux的连接档,在之前用"ls -l" 查看文件属性的命令时, 其中第二个属性是连接数.那么这个连接数是干什么的?这就要理解inode. 先说一下文件是怎么存储的 ...

  7. Linux学习笔记05—文件与目录权限

    1. 绝对路径与相对路径绝对路径:路径的写法一定由根目录 ‘/’写起,例如 /usr/local/mysql 这就是绝对路径相对路径:路径的写法不是由根目录 ‘/’写起,例如:首先用户进入到/, 然后 ...

  8. python学习笔记 操作文件和目录

    如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操 ...

  9. Linux System Programming 学习笔记(八) 文件和目录管理

    1. 文件和元数据 每个文件都是通过inode引用,每个inode索引节点都具有文件系统中唯一的inode number 一个inode索引节点是存储在Linux文件系统的磁盘介质上的物理对象,也是L ...

随机推荐

  1. 11.5 【Linq 】连接

    11.5.1 使用 join 子句的内连接 如果你打算把一个巨大的序列连接到一个极小的序列上,应尽可能把小序列作为右边序列 class Program { static void Main(strin ...

  2. js:多种方法实现数组去重

    面试的时候数组去重要多种方法实现, 只想到一种判断重复删除的方法,而且还没写对.后来大概看了一下网上的方法. 下午想到一个网上没见过的filter方法,于是整理了一下,基于以前看到的思想,然后用了一些 ...

  3. 爬虫系列(十二) selenium的基本使用

    一.selenium 简介 随着网络技术的发展,目前大部分网站都采用动态加载技术,常见的有 JavaScript 动态渲染和 Ajax 动态加载 对于爬取这些网站,一般有两种思路: 分析 Ajax 请 ...

  4. jQuery cxSelect 联动下拉菜单

    插件简介 cxSelect 是基于 jQuery 的多级联动菜单插件,适用于省市.商品分类等联动菜单. 列表数据通过 AJAX 获取,也可以自定义,数据内容使用 JSON 格式. 同时兼容 Zepto ...

  5. 关于Java中返回零长度数组或空集合比较好,还是返回null这个问题的一些想法

    近日在方法返回类型为List数据类型时,返回结果为空集合比较好,还是null比较好的问题上有点纠结. 我觉得应该统一返回空集合,这样可以不用进行空指针的判断,不然又多了一个产生bug的可能性.而有人认 ...

  6. 【codeforces 789D】Weird journey

    [题目链接]:http://codeforces.com/problemset/problem/789/D [题意] 给你n个点,m条边; 可能会有自环 问你有没有经过某两条边各一次,然后剩余m-2条 ...

  7. Java Web学习总结(22)——使用kaptcha生成验证码

    kaptcha是一个简单好用的验证码生成工具,通过配置,可以自己定义验证码大小.颜色.显示的字符等等.下面就来讲一下如何使用kaptcha生成验证码以及在服务器端取出验证码进行校验. 一.搭建测试环境 ...

  8. fzu 2132

    #include<stdio.h> double h; double tt; void s(long long m,long long n) { long long i,j,sum; j= ...

  9. 转载 - KMP算法

    出处:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html KMP算法 在介绍KMP算法之前,先介绍一下BF算法. 一. ...

  10. Spring MVC-表单(Form)标签-多行文本框(TextArea)示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_textarea.htm 说明:示例基于Spring MVC 4.1.6. 以下示 ...