[置顶] 文件和目录(二)--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标识我们究竟是谁.通常在一个会话间值是不会改变的,但是超级用户进程有方法改变 他们,在以后的进程控制中会进行 ...
随机推荐
- 使用Quartz创建定时任务
项目开发中经常需要定时循环执行某些任务 比如定时发送报表,定时发送邮件,亦或者定时清理缓存,定时更新数据等等 有些时候可以简单地利用Windows Server的计划任务执行程序 Linux也有相应的 ...
- bzoj2792
首先想到二分答案是吧,设为lim 这道题难在判定,我们先不管将一个数变为0的条件 先使序列满足相邻差<=lim,这个正着扫一遍反着扫一遍即可 然后我们就要处理将一个数变为0的修改代价 当i变为0 ...
- bzoj2245: [SDOI2011]工作安排
费用流. 这道题的模型比较明显,拆点也是很容易看出来的. #include<cstdio> #include<algorithm> #include<cstring> ...
- Asp.Net微信登录-电脑版扫描二维码登录
像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 一.创建网站应用 在微信开放平台创建一个网站应用 https:// ...
- ffmpeg/ffplay vc6 源码剖析
ffmpeg/ffplay是当今多媒体领域的王者,很多很多的人想研究学习ffmpeg/ffplay,但苦于ffmpeg/ffplay庞大的代码量,令人望而生畏.为帮助更多的人研习ffmpeg/ffpl ...
- Oracle 闪回特性(FLASHBACK DATABASE)
--===================================== -- Oracle 闪回特性(FLASHBACK DATABASE) --======================= ...
- ECSHOP seo修改建议
ECSHOP是一个非常优秀的商城程序,以丰富的模板.稳定开源.非常快的执行速度赢得广大网店主的青眯.可是新建站30多天,目前百度只收录了首页,而google收录正常.我检查了他的网站一切正常,没有任何 ...
- button捕捉回车键
为了给一个页面设置回车默认触发的按钮功能,我浏览了IE上的诸多方法,有的言不达意,有的读不懂,后来把高手的一段代码改造后,形成了一段代码,使这个问题的解决变得非常简章,有兴趣的朋友不妨一试.<s ...
- mysql5.6子查询的优化
https://dev.mysql.com/doc/refman/5.6/en/subquery-optimization.html Semi-join in MySQL 5.6 MySQL 5. ...
- hdu 3341(ac自动机+状态压缩)
题意:容易理解... 思路:首先一开始容易想到要用到dp,开设一个dp[41][41][41][41][501]的数组来解决,但是明显内存已经超出范围了,于是就想如何减少内存呢?只要知道A.T.C.G ...