[置顶] 文件和目录(二)--unix环境高级编程读书笔记
在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中。对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中block的大小是有关系的,符号链接的长度是它所指向的文件名字的长度。
文件的截短可以在使用open函数时,用O_TRUNC标记,这样将会在打开文件时将文件的内容清空。linux专门为我们提供了两个函数以指定定的长度打开文件:
int truncate(const char* pathname,off_t len);
int ftruncate(int filedes,off_t len);
如果函数执行成功,则返回0,否则返回-1。如果文件的长度大于指定的长度,则直接将文件截短即可,否则就可能会产生空洞文件。
与linux的文件系统相关的术语得先说清楚:
1.inode节点:用来记录与文件相关的一系列信息,包括文件的所有者,权限,文件长度以及文件在磁盘中的位置等,每个文件只有一个i节点
2.目录项:用来记录文件名和文件的inode节点号
3.block:用来记录文件的实际内容,它在磁盘上的位置由inode来指示。它的大小为1,2,4Kbyte
目录项,inode节点和block的关系如下:
这幅图取自《unix环境高级编程》,我们可以看到目录项中包含i节点编号及文件的名字,而inode节点中有包括了文件在磁盘中数据块的位置,这就是基本的linux中文件系统的架构图。我们注意到在图中有两个不同的目录项指向同一个inode节点,这在是允许的,这种情况称为硬连接,不管删除了哪一个目录项,只有还有一个存在,就可以访问该文件。与之对应的还有一种连接,称为符号链接。在inode节点中,存储着一个与inode节点相链接目录数。如上图中的inode节点的连接数为2,因为有两个目录项指向该inode节点。对于一个空的目录,指向该目录的连接数为2,包括一个目录项和表示当前目录的“.”。如果该目录中还有一个子目录,则原目录的连接数为3,因为子目录中海报扩一个指向父目录的“..”选项。所以说每当在一个目录中建立一个子目录,该目录的连接数将会加1。
任何一个文件可以有多个目录项指向其inode节点,创建一个指向文件的链接需要使用link函数,它的函数原型如下:
int link(const char* existingpath,const char* newpath);
如果函数执行成功,则返回0,否则返回-1。解除一个文件的链接使用unlink函数,这个函数在执行完成后,会检查指向inode中的连接数目,若为0,当进程结束后,则将文件从磁盘上删除,否则不删除。它的函数原型如下:
int unlink(const char* pathname);
如果执行成功,则返回0,否则返回-1。当对文件进行解除链接操作时,需要对该文件所在的目录具有写权限和执行权限。remove和rename函数分别用来删除文件和对文件进行重新命名。
符号链接和硬链接不同,符号链接类似于windows中的快捷方式,可以建立指向任意一个文件和目录的符号链接,即使该文件不存在也没关系。但是硬连接要求文件必须存在,并且一般不允许建立到目录的硬链接。建立一个符号链接的函数是symlink,它的函数原型是:
int symlink(const char* actualpath,const char* sympath);
读取一个符号链接的方法是readlink,它不会跟随符号链接指向的文件,返回的是符号链接本身的信息,即它所指向的文件的名字。
与文件相关的时间有三个,即stat中的三个成员:st_atime,st_mtime,st_ctime。st_atime表示最后一次存取文件的时间,一般为最后一次读操作的时间。st_mtime为文件内容最后一次修改的时间,比如写操作就会造成这个时间的改变。st_ctime是文件状态最后一次改变的时间,引起这个时间变化的函数为chmod,chown等。utime函数可以用来修改前面两个时间的值,但是不能修改st_ctime的值,这个值是由系统自己改变的。
mkdir和rmdir用来创建和删除目录。在对目录进行读操作的时候,会涉及到下面的四个函数,opendir,readdir,closedir,rewinddir。改变进程的工作目录可以使用函数chdir和fchdir,获得进程的当前工作目录可以使用getcwd。
[置顶] 文件和目录(二)--unix环境高级编程读书笔记的更多相关文章
- unix环境高级编程-读书笔记与习题解答-第一篇
从这周开始逐渐的进入学习状态,每天晚上都会坚持写c程序,并且伴随对这本书的深入,希望能写出更高质量的读书笔记和程序. 本书的第一章,介绍了一些关于unix的基础知识,在这里我不想去讨论linux到底是 ...
- unix 环境高级编程-读书笔记与习题解答-第二篇
第四节 输入与输出 上次的笔记中写到的 open, read, write, lseek 以及close ,都是不带缓存的IO函数,这些函数都使用文件描述符进行工作. 上一篇笔记用到的 read(ST ...
- [置顶] 文件io(一)--unix环境高级编程读书笔记
unix-like(后面以linux为例)系统中的文件操作只需要五个函数就足够了,open.close.read.write以及lseek.这些操作被称为不带缓存的io,这里有必要说一下带缓存和不带缓 ...
- unix 环境高级编程 读书笔记与习题解答第四篇
第一章 第六节 第一小节 这一章没有程序设计和API方面的深入学习,而是注重介绍了unix操作系统中的原始数据类型和系统原型函数,错误处理方面的知识. ____unistd.h____ 该文件包含了u ...
- unix进程的环境--unix环境高级编程读书笔记
http://blog.csdn.net/xiaocainiaoshangxiao/article/category/1800937
- unix环境高级编程 读书笔记
1.上班业余时间把书下载下来,第一章读完了,但是程序只能回家运行啦!Fighting!
- Unix环境高级编程学习笔记——fcntl
写这篇文正主要是为了介绍下fcntl,并将我自己在学习过程中的一些理解写下来,不一定那么官方,也有错误,希望指正,共同进步- fcntl: 一个修改一打开文件的性质的函数.基本的格式是 int fcn ...
- 《UNIX环境高级编程》笔记——4.文件和目录
一.引言 本章描述文件系统的其他特征和文件的性质.有些背景知识需要注意,例如用户ID与文件权限.文件系统等. 二.函数stat.fstat.fstatat和lstat #include <sys ...
- 《UNIX环境高级编程》笔记--文件访问权限和新文件、目录所有权
1.与进程关联的用户ID和组ID 与一个进程关联的ID有一下几个: 实际用户ID和实际组ID标识我们究竟是谁.通常在一个会话间值是不会改变的,但是超级用户进程有方法改变 他们,在以后的进程控制中会进行 ...
随机推荐
- 服务--web服务
.面向对象和面向组件 .什么是Web服务 Web Service "Stack" .Web服务的应用分类 Web服务都是对象/组件技术在Internet中的延伸 面向对象和面向组件 ...
- UVa 12230 (期望) Crossing Rivers
题意: 从A到B两地相距D,之间有n段河,每段河有一条小船,船的位置以及方向随机分布,速度大小不变.每段河之间是陆地,而且在陆地上行走的速度为1.求从A到B的时间期望. 分析: 我们只要分析每段河的期 ...
- Android listView如何判断数据多屏显示 (2012-03-06 09:47:04)
@Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int tot ...
- BZOJ 3573 米特运输
语文题... 原来除了hash还可以取对数啊orz #include<iostream> #include<cstdio> #include<cstring> #i ...
- codevs 3290 华容道
HAHAHA BFS+SPFA. #include<iostream> #include<cstdio> #include<cstring> #include< ...
- C# winform 窗体从右下角向上弹出窗口效果
参考自 http://blog.csdn.net/yilan8002/article/details/7197981 /// <summary> /// 窗体动画函数 注意:要引用Syst ...
- JavaScript备忘录-闭包
var arr = new Array(); function Person() { for (var i = 0; i < 10; i++) { //要记住,这个属性函数申明,只有立即执行才会 ...
- CSS的伪元素(二)
随便聊聊CSS的伪元素,虽然它们在项目开发中用的并不多,但确实很有用,在项目中不用它,是因为大家不能了解它们,下面是一个工作场景,如有四个按钮,分别是建立,编辑,删除和修改,而我们要求这在前台显示的汉 ...
- 数据来自后台非Ajax加载的联动实现方法
要实现的效果如下,通过一级标签来控制二级标签, 第一步:在Conctroller中获取数据,并且请到modle里面返回 ModelAndView model = new ModelAndView(&q ...
- POST 一张 图像的调试来认识 http post
上传图片的详细 2559字节