[APUE] 读书散记

来源:互联网 发布:如何在mysql修改密码 编辑:程序博客网 时间:2024/04/30 03:52

一,目录部分 (7-22)

1,目录,是一个包含 “目录项” 的文件,什么事目录项呢??

 

2,每个目录项都包含一个文件名,同时还包含说明该文件属性的信息。

 

3,文件属性:type, length, owner, group, modify time, access time, change time.

modify/ change 这两个定义的非常诡异,光听名字,难以区别,呵呵!!

 

4,stat/fstat 可以查看 文件属性的内容。

 

5,文件名:除了 (/)(空格),其他字符都可以。如果文件名中出现特殊字符,必须用shell 的引号机制来 引用文件名。非常麻烦,建议使用常用字符,呵呵!!

> 创建一个目录时,默认的会有两个文件被创建,即(. 点)(.. 点点),分别为当前目录和上级目录。在顶级目录之下,这两个文件指向同。

 

6, struct dirent, 这个事文件夹属性的结构体,需要 include dirent.h.

 

从中,我们可以看到,对于文件夹的命名,不能超过256个字符。

 

7, opendir 返回 DIR结构体,这个结构体没有找到定义,据说由 glibc 库定义(__dirstream),很多建议不用理会DIR结构体是如何定义的。连作者也这么说??

而 readdir 读取 DIR 结构体后,返回 dirent 结构体,这个结构体我们是可以找到定义的,如前所述,而ls 这里打印 文件名,只需要用到结构体中的 d_name。因此,可以用 d->d_name 来获取文件名,呵呵。

 

8,文件描述符( file descriptor fd), 很小的非负整数。

9,所有程序运行时,都会打开 stderr/stdout/stdin 三个文件描述符。

10, 不用缓存的I/O。设计函数 (read/write/open/close/lseek)。一样需要把 read 读取的字节存入数组,为什么说是不用缓存??

这个翻译有点诡异,呵呵!!

 

在英文版上看,原文为 Unbuffered I/O is provided by the functions open, read, write, lseek, and close. These functions all work with file descriptors。

还是不明白,用文件描述符工作,就不用缓存了么。

 

经过搜索发现,原来是这样的:

读缓存,指的是,除了读取指定长度的内容,还会将这部分内容放入内存中,再次读取的时候,就可以直接读取“上次已缓存”的内容,不用再次发生文件I/O。

写缓存,是先将要写入文件的内容放入内存,而后再一次写入文件中。不是马上立刻往文件中写入。所以,或许翻译为 “不做缓存”更容易理解,呵呵

 

 

二。文件

1,文件包含 Inode 结构,还包含 一个目录项结构(directory entry, 简称 dentry).

denty -> d_ino| d_name (由i节点编号和 文件名构成)

inode -> 指向具体的数据块,还有其他相关的文件属性,比如文件 atime,ctime,lenth等等。

 

stat 函数可以获取文件信息,就是从这两部分获取到相关信息的

 

2, 目录和文件

目录下新增文件,则

会影响目录I节点中的size,所以会改变 ctime。

会影响目录中文件列表,即目录文件的内容,因此会影响  mtime.

 

原创粉丝点击