在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环境高级编程读书笔记相关推荐

  1. linux系统数据文件和信息--unix环境高级编程读书笔记

    linux系统中的数据文件有很多,在这一章里介绍的主要内容是和系统有关的一系列文件,包括passwd,shadow,group,utmp,wtmp以及一些系统的相关信息和时间的相关操作. 1.pass ...

  2. 文件io(一)--unix环境高级编程读书笔记

    unix-like(后面以linux为例)系统中的文件操作只需要五个函数就足够了,open.close.read.write以及lseek.这些操作被称为不带缓存的io,这里有必要说一下带缓存和不带缓 ...

  3. linux信号(二)--unix环境高级编程读书笔记

    1.信号集 在linux中,可以用一个称为信号集的数据类型  sigset_t,来表示所有的被阻塞信号的一个集合.对这个集合的操作函数有: #include <signal.h>int s ...

  4. 高级IO(一)--UNIX环境高级编程读书笔记

    在前面学习了文件IO,标准IO和终端IO,现在学习高级IO,UNIX中怎么有这么多的IO. 1.非阻塞IO 可以将系统调用分为两类:低速系统调用和其他.低速系统调用是可能会使进程永远阻塞的一类系统调用 ...

  5. unix进程的环境--unix环境高级编程读书笔记

    1.进程的启动 进程总是从   main   函数开始执行的,main函数的函数原型如下: int main(int argc,char* argv[]); 当内核启动  c   程序时,使用一个   ...

  6. linux进程控制(一)--unix环境高级编程读书笔记

    1.进程PID和特殊的3个进程 每一个进程在系统中都有一个唯一的标识,这个标识叫做进程标识符,或者叫  PID(process identity).我们可以通过调用  getpid  函数来获取一个进 ...

  7. 标准IO库--unix环境高级编程读书笔记

    标准IO库是C语言提供的一个库,不光存在于linux中,在windows中也是有的.标准IO库和文件IO的不同是,标准IO库是对文件IO(即系统调用)的封装,并且在用户层添加了一些缓冲区. 文件IO的 ...

  8. APUE Unix环境高级编程读书笔记

    .. 转载于:https://www.cnblogs.com/solitrarychen/p/5407536.html

  9. linux信号(一)--unix环境高级编程读书笔记

    1.信号的概念 在这里要给出一个信号的准确概念感觉很困难,可以这么说,信号就是进程之间或者内核与进程间异步通信的一种机制,有点类似于中断的性质.在  linux  系统中有  31  种信号,每一种信 ...

最新文章

  1. android插件化-apkplug中以监听方式获取OSGI服务-09
  2. java out of range_关于Parameter index out of range求解决办法
  3. 大家都收藏了的最新开源项目Top12!CV、NLP、机器学习一应俱全
  4. The constructor JedisPool(GenericObjectPoolConfig, String, int, int, String) refers to the missing t
  5. Linux非阻塞IO(八)使用epoll重新实现非阻塞的回射服务器
  6. POJ1328贪心放雷达
  7. LeetCode - 695. Max Area of Island (Java)
  8. Java使用PDFBox开发包实现对PDF文档内容编辑与保存
  9. cpu使用率 htop显示_用top、vmstat、Htop、sar命令在Linux系统中检查CPU使用率/利用率...
  10. iPhone屏幕做一个最上层全屏幕的layer
  11. vue.js 使用axios实现下载功能
  12. RHEL 4 安装单实例oracle 10g
  13. SpringBoot文档翻译系列——26.日志logging
  14. JQuery之拖拽插件
  15. 企业对计算机类专业人才培养方案,应用型本科计算机科学与技术专业人才培养方案探讨...
  16. 非科班无实习如何入职腾讯?后台开发岗个人校招学习路线分享!
  17. DDR SDRAM内存优化
  18. 用python画篮球场_如何使用 Python 创建一个 NBA 得分图
  19. 关于cmd打开时提示“系统找不到指定的路径”问题
  20. 我参加NVIDIA Sky Hackathon(语音识别模型训练)

热门文章

  1. 客户关系管理之会员管理(转)
  2. .NET设计模式(10):装饰模式(Decorator Pattern)
  3. 机器学习-数据科学库-day5
  4. Charles抓包工具过滤网络请求
  5. 正则表达式的几个简单验证
  6. mysql添加mcafee 审计插件
  7. 使用struts中的DisPatchAction的时候需要用到的jar包
  8. 推荐算法和机器学习入门
  9. 为什么一个实例只有一个LGWR
  10. 2005数据库结构显示收藏