[置顶] 文件和目录(二)--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标识我们究竟是谁.通常在一个会话间值是不会改变的,但是超级用户进程有方法改变 他们,在以后的进程控制中会进行 ...
随机推荐
- textContent、innerText的用法,在文档中插入纯文本
有时候需要查询纯文本形式的元素内容,或者在文档中插入纯文本.标准的方法是用Node的textContent属性来实现: var para = document.getElementsByTagName ...
- [020] Android模拟器访问本地Web应用
本篇文章试图解决这样一个问题:如何在Android模拟器上访问本地的Web应用? 例如,在你的开发机器上启动一个Tomcat服务,接着打开电脑上的浏览器,默认情况下输入http://localhost ...
- [转]SQL、LINQ、Lambda
原文链接:http://www.cnblogs.com/mr-hero/p/3532631.html SQL LinqToSql Lambda 1. 查询Student表中的所有记录的Snam ...
- RPi 2B Documentation
/********************************************************************** * RPi 2B Documentation * 声明: ...
- VirtualBox clonevdi文件和修改vdi的uuid
因为VirtualBox下,不允许有相同的uuid,所以要拷贝一份新的vdi像普通的拷贝是办不到的.需要用VirtualBox自带的一个.exe文件VBoxManage. 1.首先,进入终端或者是命令 ...
- oracle 回收站管理
oracle10g,在pl/sql中选中删除后会出现类似:BIN$nJ5JuP9cQmqPaArFei384g==$0的表. 1.查看回收站 select * from user_recyclebin ...
- Android平台下实现录音及播放录音功能的简介
录音及播放的方法如下: package com.example.audiorecord; import java.io.File; import java.io.IOException; import ...
- 【转】iOS开发UITableViewCell的选中时的颜色设置
原文网址:http://mobile.51cto.com/hot-404900.htm 1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSe ...
- 简单易用的AOP/IOC框架
Source: http://www.codeproject.com/KB/Articles/684613/Working/AopIoc.zip Introduction Supper framewo ...
- Team them up!
题意: 给出n个人以及认识其他人的情况,现在要把所有人分成两队,每队至少一人,求使两队人数差距最小且每队内部的人都相互认识的分队情况. 分析: 这道题让我学习到了不少,首先看到使差距最小就想到了背包, ...