1.引言



本章介绍文件系统的特征和文件的性质。从stat函数开始,逐个说明stat结构的每一个成员以了解文件的所有属性。在此过程中,还将会说明修改这些属性的各个函数,并更详细地查看UNIX文件系统的结构和符号连接,最后还介绍对目录进行操作的各个函数。





大概就是介绍以下几点:

1.stat函数和stat结构的每一个成员(这些都是文件的属性)。

2.修改每个属性的对应函数。(比如修改文件权限的chmod函数)。

3.UNIX文件系统的结构和符号链接

4.对目录进行操作的各个函数。





先介绍3个stat函数:

#include <sys/stat.h>

int stat(const char *pathname, struct stat *buf); //一旦给出pathname,stat函数就返回与此命名文件有关的信息结构

int fstat(int fd, struct stat *buf); //而fstat则获取文件描述符fd来打开文件信息

int lstat(const char *pathname, struct stat *buf); //lstat函数则类似stat,但当pathname是符号链接的时候,就返回符号连接的有关信息而不是文件信息(符号链接会在以后介绍)





第二个参数buf是指针,它指向一个由我们提供的stat结构,而这些函数呢就将信息写进stat结构中。





下面给出stat结构的成员(不同系统可能实现不同,但是基本形式是差不多的):

/* 我用"man 2 stat"给出stat的结构定义的 */

struct stat {

dev_tst_dev;/* ID of device containing file */

ino_t st_ino;/* inode number */

mode_tst_mode;/* protection */

nlink_tst_nlink;/* number of hard link */

uid_tst_uid;/* user ID of owner */

gid_tst_gid;/* group ID of owner */

dev_tst_rdev;/* device ID (if special file) */

off_tst_size;/* total size, in bytes */

blksize_tst_blksize;/* blocksize for filesystem I/O */

bllcnt_tst_blocks;/* number of 512B blocks allocated */





/* 下面的定义是Linux 2.6之后加进来的 */

struct timespecst_atim;/* time of lass access (最后一次查看文本内容)*/

struct timespecst_mtim;/* time of last modification (最后一次修改文本内容)*/

struct timespecst_ctim;/* time of last status change (最后改变文件状态)*/

#definest_atimest_atim.tv_sec;/* 向后兼容 */

#definest_mtimest_mtim.tv_sec;

#definest_ctimest_ctim.tv_sec; 

};





使用stat函数最多的可能是ls -l命令了,用其可以获得一个文件的所有信息。





文件类型:





UNIX/LInux中的文件类型可分为7种。

1.普通文件(regular file):

最常用的文件类型,这种文件包含了某种形式的数据。

2.目录文件(directory file):

这种文件包含了其他文件的名字以及指向这些文件有关信息的指针。对一个目录文件具有读权限的任一进程都可以读该目录的内容。但只有内核可以直接写目录文件。进程必须使用上述提到的第4点的函数才能更改目录。

3.块特殊文件(block special file):

这种文件类型提供对设备(例如磁盘)带缓冲的访问,每次访问都以固定长度为单位进行。

4.字符特殊文件(character special file):

这种文件类型提供对设备不带缓冲的访问,每次访问长度可变。系统中的所有设备要么是字符特殊文件,要么是块特殊文件。

5.FIFO:

这种类型文件用于进程间通信,有时也将其命名为管道(named pipe)。

6.套接字(socket):

这种文件类型用于进程间的网络通信。

7.符号链接(symbolic link):

这种文件类型指向另一个文件。





文件类型信息保存在stat结构的st_mode成员中。可以用下面的宏来确定文件类型:

#include <sys/stat.h>

S_ISREG()//普通文件

S_ISDIR()//目录文件

S_ISSCHR()//字符特殊文件

S_ISBLK()//块特殊文件

S_ISFIFO()//管道或FIFO

S_ISLINK()//符号链接

S_ISSOCK()//套接字

如果S_ISDIR(st_mode)返回的是真,是目录文件,否则不是目录文件。





设置用户ID和设置组ID

与进程相关联的ID有6个或更多。

实际用户ID和实际组ID标识我们究竟是谁。这两个字段取自登陆时的口令文件中的登陆项。

有效用户ID和有效组ID则决定了我们的文件访问权限。(接下来只讲这四个)



一般来说,实际用户ID等于有效用户ID,实际组ID等于有效组ID。(因为你登陆了你当然是访问自己的home文件)

每一个文件都有一个所有者和组所有者,所有者由stat结构中的st_uid成员表示,组所有者则由st_gid成员表示。



在执行一个程序文件时,进程的有效用户ID通常就是实际用户ID,有效组ID通常就是实际组ID。但是可以在st_mod中设置一个特殊标志,其含义是:“当执行此文件时,将进程的有效用户ID设置为文件所有者的用户ID(st_uid)”。与此类似,还可以设置另一位,它使得将执行此文件的进程的有效组ID设置为文件的组所有者ID(st_gid)。这就是设置用户ID(Set-User-ID)和设置组ID(Set-Group-ID)。

例如,若文件所有者时超级用户,而且设置了该文件的设置用户ID,然后当该程序由一个进程执行时,则该进程具有超级用户特权(也就是有效用户ID设置为文件所有者的ID)。不管执行该进程的实际用户ID是什么,都进行这种处理。例如,UNIX程序passwd(1)允许用户改口令(一般是/etc/passwd或/etc/shadow),而只有超级用户才具有对该文件写的权限,所以需要设置用户ID。因为运行设置用户ID的进程通常得到额外的权限,所以编写这种程序时要特别谨慎。





文件访问权限:





每个文件有9个访问权限,可以分为三类:所有者,组,和其他人。每类分别有读(r),,写(w)和执行(x)的权限。

由st_mode决定,具体可google。





对于目录的读权限和执行权限的意义是不同的。读权限就是能够获取里面文件的名字(就像用ls),但是执行权限就是当对里面的文件执行某种操作的时候(比如 ls -l *file),如果没有目录的执行权限的话就执行不了。

在目录中创建一个新文件,就必须对该目录具有写权限和执行权限。

为了删除一个现有的文件,就必须对包含该文件的目录具有写权限和执行权限,对该文件本身则不需要写和执行权限。





第四章笔记待续。

《APUE》第四章笔记(1)的更多相关文章

  1. apue第四章学习总结

    apue第四章学习总结 4.1.若以stat函数去替换lstat函数,会发生: 原来的目录路径: $:~/workspace/apue2/include$ ls -l apue.h abc lrwxr ...

  2. #Python编程从入门到实践#第四章笔记

    #Python编程从入门到实践#第四章笔记   操作列表 ​​​1.遍历列表 使用for循环,遍历values列表 for value in values: print(value) 2.数字列表 使 ...

  3. 《APUE》第四章笔记(2)

    下面介绍对stat结构的各个成员的操作函数. 先贴个stat结构的图: access函数: #include <unistd.h> int access(const char *pathn ...

  4. C#语言和SQL Server第十三 十四章笔记

    十三章  使用ADO.NET访问数据库 十四章使用ADO.NET查询和操作数据库 十三章:                                                       ...

  5. 《HALCON数字图像处理》第四章笔记

    目录 第四章 HALCON数据结构 HALCON Image图像 图像通道 HALCON Region区域 Region的初步介绍 Region的点与线 Region的行程 Region的区域特征 H ...

  6. linux第四章笔记

    第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间.进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统. 最大限度利用处理器时间的原则:只要有可以执行 ...

  7. 《APUE》第四章笔记(4)

    这算是在博客园写的第一篇文章啊,之前都在csdn写(虽然才写了几篇,因为开通也没多少天..),还是稍微期待下吧.我写博客的主要意图是一来能够记录下来自己所学过的东西,二来也想能够跟大家交流,能够得到更 ...

  8. 《APUE》第四章笔记(3)

    文件系统 首先我们应该知道一个磁盘可以划分为多个分区,而每个分区就可以包含一个文件系统.UNIX的文件系统是这样的: 而我们主要关心的是i节点和数据块.i节点是固定长度的记录项,它包含有关文件的大部分 ...

  9. Vue2.5开发去哪儿网App 第四章笔记 上

    一 .  组件细节知识点 1.  解决组件在h5中编码规范 例如 : table , ul , ol  等等 <table> <tbody> <row></r ...

随机推荐

  1. 【M12】了解“抛出一个exception”与“传递一个参数”或“调用一个虚函数”之间的差异

    1.方法参数的声明语法和catch语句的语法是一样的,你可能会认为主调方法调用一个方法,并向其传递参数,与抛出一个异常传递到catch语句是一样的,是的,有相同之处,但也有更大的不同. 2.主调方法调 ...

  2. 【55】让自己熟悉Boost

    1.网址:http://boost.org 2.有很多C++组织和网站,但是Boost库有两个优势:a.和标准委员会关系密切:b.加入C++标准的各种功能的测试场.

  3. Rational Rose--简介

    Rational Rose Rational Rose是Rational公司出品的一种面向对象的统一建模语言的可视化建模工具.用于可视化建模和公司级水平软件应用的组件构造. 目前版本的Rational ...

  4. 华为的JAVA面试题及答案(部分)

    华为的JAVA面试题 (后记:没有想到华为的面试题就是非同一般,非常多题不是一眼就行看得出来,至少对我这种鸟来说是这样.对我个人来说,看看这种题,可能比看<Think In Java>都还 ...

  5. C# 之 SqlConnection 类

    一.常用属性 [1]ConnectionString  获取或设置用于打开 SQL Server 数据库的字符串. (重写 DbConnection.ConnectionString.) [2]Con ...

  6. 封装,capsulation,&&继承,Inheritance,&&多态,polymorphism

    Inheritance&&polymorphism 层次概念是计算机的重要概念.通过继承(inheritance)的机制可对类(class)分层,提供类型/子类型的关系.C++通过类派 ...

  7. 随便写写,当作了解--Css

    Css,Cascading Style Sheets,层叠样式表.用于控制HTML页面样式.他的基本格式由两部分组成: 选择器 声明块 一.使用 css的注释用 /* 注释内容 */ 1.导入外部样式 ...

  8. 解决myeclipse过期问题

    一般myeclise使用期限为30天,超过之后,会频繁的提醒你,购买软件,很讨厌,有个这个小工具,,以后再也不怕啦!!! 使用方法: 1:将这个类导入到myeclipse包中 2:运行main方法,提 ...

  9. 关于Git的stash命令

    add 添加新文件到 Git 代码仓库的索引中 $ git add filename mv 移动或重命名文件 $ git mv old-filename new-filename rm 从工作目录和 ...

  10. 【转载】Git的安装与使用

    Git的安装与使用  转载来源:http://www.cnblogs.com/Bonker/p/3441781.html 1,下载git https://code.google.com/p/msysg ...