[置顶] 文件和目录(二)--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标识我们究竟是谁.通常在一个会话间值是不会改变的,但是超级用户进程有方法改变 他们,在以后的进程控制中会进行 ...
随机推荐
- Java知识点:琐碎知识点(3)
零碎 switch(x),x只可以是enum或byte.short.char.int. 枚举在switch-case语句作为标签时必须是枚举常量的非限定名称,否则Compile Error. Enum ...
- 【C#学习笔记】类构造函数使用
using System; namespace ConsoleApplication { class stu { private string name; private int age; publi ...
- MVC&WebForm对照学习:ajax异步请求
写在前面:由于工作需要,本人刚接触asp.net mvc,虽然webform的项目干过几个.但是也不是很精通.抛开asp.net webform和asp.net mvc的各自优劣和诸多差异先不说.我认 ...
- T-SQL查询进阶-10分钟理解游标
转:http://www.cnblogs.com/CareySon/archive/2011/11/01/2231381.html 概述 游标是邪恶的! 在关系数据库中,我们对于查询的思考是面向集合的 ...
- excel用vlookup,lookup时查询数据需要排序
如题,排出来的数据不对,之前没有是看清楚..所以记下来,日是后要小心点....
- HDU 5762 Teacher Bo
Teacher Bo Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tota ...
- Easy Climb
题意: 有n块石头,给定他们的高度,现保持第一和最后一块高度不变,其他可增加和减少高度,求通过变换使所有相邻石头的高度差的绝对值不大于d,所变化高度总和的最小值. 分析: 状态还可以想出来,dp[i] ...
- Oracle中表结构和表内容复制
处理该问题注意以下几点: 1. 清空表中数据SQL:truncate table table_name; 2.复制表结构SQL:create table table_name1 as select * ...
- C++的笔记学习第一篇,认识C++
在一个类中包含两种成员: 数据和函数,分别称为C++数据成员和成员函数. 关于类: 类是C++新增加的重要数据类型,有了类,就就可以实现面向对象程序设计方法中的封装.信息隐蔽.继承.派生.多态等功能. ...
- 如何在 Windows Azure 的虚拟机 ubuntu 上面安装和配置 openVPN(三)
第三步:安装openVPN 请打开 ubuntu 官方文档.然后,从上到下,按照步骤,输入执行命令.大家只需要执行到 First trouble shooting 之前即可. 不要怕麻烦,仔细读,一步 ...