1.对于内核,所有打开或者新创建的文件都通过文件描述符引用。open或者creat获得的文件描述符传递给read或者write做相关函数的第一参数。

【1】open函数,除非创建新的函数带第三个参数,否则都是两个参数。第一个参数代表文件路径名字;第二个是文件状态标志。文件状态标志包括必选的且只能选择其中一个的三个状态以及多个可选的状态,必选包括RDONLY/WRONLY/RDWR,可选包括每次写时追加到文件尾的O_APPEND(此方法可以使两个进程往同一个文件写时的操作变为两个原子操作,防止第二个进程写时覆盖掉第一个进程写的内容),O_EXCL判断文件是否存在,不存在则创建,等等其他。

【2】creat函数,只能以只读方式打开所创建的文件【3】close,关闭文件关闭同时记录锁

【3】lseek(int fd, off_t offset, int whence),whence是SEEK_SET时,文件偏移量为距文件offset个字节,whence为SEEK_CUR,文件偏移量与CUR偏移量有关,为CUR偏移量+offset个字节,为SEEK_END时,为文件长度+offset。偏移量的目的是,读写从偏移量处位置开始。如偏移量为10,则会从第10位字符读到最末一位。这就出现一个空洞的概念,即偏移量定位到超过文章长度的位置,则在原文件末尾与新开始操作的位置直接出现不需要分配磁盘块的空洞。这是允许的。

【4】内核使用三种数据结构表示打开的文件,不同进程间共享打开的文件。进程表项包括文件描述符,文件描述符包含一个文件描述符标志(目前只有一种:FD_CLOEXEC,包括状态0,exec不关闭,状态1,exec关闭)。以及一个指向文件表的文件指针,文件表包括文件状态标志(O_RDONLY/O_WRONLY/O_RDWR等这些),文件偏移量,以及指向V节点表的v节点指针。不同进程打开同一个文件时,包含文件类型和操作函数(v节点信息)以及索引节点(i节点信息)的v节点表是相同的。文件表和进程表项不同。

【5】为了read和write成为原子操作。使用能够顺序执行sleek和read以及sleek和write的pread以及pwrite函数。【6】dup和dup2用来复制一个已存在的文件描述符。dup返回一个可用的最小的文件描述符值,

duo2(fd,fd2)函数用fd2指定的描述符数值,如果fd2已经存在,则进行原描述符关闭,如果fd=fd2 ,则返回fd2,且不进行关闭。

【7】由于存在延迟写(即缓存区必须要写满或者缓存区需要重用才将缓存排入输出队列),引入fsync(fd),fdatasync(fd),sync(void)三个函数。通过守护进程定时调用sync,会将修改过的块缓冲区排入写队列。fsync和fdatasync对fd起作用,等待写磁盘操作结束就返回。区别在fsync可以同步更新文件的属性。

【8】fcntl函数根据打开的文件描述符就可以修改文件性质。int fcntl(fd,cmd,。。。)

(1)F_DUPED,复制一个现有描述符。返回新文件描述符是尚未打开的各描述符中大于或者等于第三个参数值中的最小值。与fd同一个文件表项,但是有不同的文件描述符。FD_CLOSEEXEC(文件描述符标志)被清除

(2)获得/设置文件描述符标记,F_GETFD或F_SETFD(FD_CLOEXEC)

(3)获得/设置文件状态标志F_GETFL或F_SETFL等。F_GETFL取得值之后要先与O_ACCMODE进行与取得访问模式位。才是O_RDONLY/O_WRONLY/O_RDWR三者之一。

int testfd = fcntl (fd,F_GETFL, 0);

testfd |= flag;

fcntl(fd, F_SETFL, testfd); 给fd在原来的文件状态标志基础上与了新的标志,并设置给fd。

转载于:https://www.cnblogs.com/yinsheng1/p/6164972.html

UNIX环境高级编程第三章相关推荐

  1. Linux - Unix环境高级编程(第三版) 代码编译

    Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebo ...

  2. UNIX环境高级编程(第三版 源码及编译好的静态库文件)

    UNIX环境高级编程(第三版) 源码 及 库文件 链接: https://pan.baidu.com/s/1tPY17lWNDEbzkOwZaRUUNg 提取码: 1024 复制这段内容后打开百度网盘 ...

  3. UNIX环境高级编程-第三版

    Unix环境高级编程-第三版 之前学习了<Linux系统编程>对于常见的概念和函数都有了基础的认知,这里准备通过这本书,深入学习系统API相关内容.笔记内容会有所倾向,不会严格反应书本内容 ...

  4. UNIX环境高级编程--第七章

    1进程终止 进程正常终止: view plaincopy to clipboard #include<stdlib.h>    void exit(int status);    void ...

  5. UNIX环境高级编程(三)—— 静态链接库与动态链接库

    动态链接库一般不开放源码,需要建工程才能使用(其中提供的接口和 API): 0. .a/.o/.so What are .a and .so files? .o 就相当于 windows 里的 obj ...

  6. Unix环境高级编程-第四章

    1.引言 上一章我们说明了执行IO操作的基本函数,其中的讨论是围绕普通文件IO进行的-打开文件,读文件或写文件.本章将描述文件系统的其他特征和文件的性质.我们将从stat函数开始,逐个说明stat结构 ...

  7. unix环境高级编程第三版源代码编译及使用

    估计好多学习unix/linux的程序员都知道有这么一本书,最近笔者也开始膜拜膜拜此书,在编译源代码的时候,遇到了一些问题,现在在这里做下总结,加深自己的印象,或许也有遇到此问题的同仁,可以参考参考! ...

  8. UNIX环境高级编程 第11章 线程

    使用C++调用pthread_cleanup_push( )时,下面的代码是无法编译通过的: pthread_cleanup_push(cleanup, "thread 1 first ha ...

  9. UNIX环境高级编程 第12章 线程控制

    c'nblogs 转载于:https://www.cnblogs.com/pluse/p/6889874.html

最新文章

  1. 深入理解分布式之数据库和缓存双写一致性方案解析
  2. Selenium WebDriver- 操作 IFrame 中的页面元素
  3. 哪种人是软件设计中的稀缺型人才?
  4. 火狐浏览器如何更改字体 火狐浏览器字体更改方法分享
  5. java mvc返回js_技术趋势:是什么让MVC悄然消失的?
  6. python3 读取写入excel操作-win32com
  7. android toast 自定义时间,android自定义Toast设定显示时间
  8. 静态成员变量和非静态成员变量
  9. 23种设计模式(十二)对象性能之享元模式
  10. 梯度下降优化算法综述
  11. 动态规划(dp)的总结
  12. vue图片裁切cropperjs的使用
  13. 网站制作的流程是什么?网站制作的流程包括哪些步骤?
  14. 【论文翻译】Semantic Relation Reasoning for Shot-Stable Few-Shot Object Detection
  15. 关于批量下载MODIS数据的坑
  16. 博客园增加Live2D看板娘教程,超级简单,一看就懂
  17. SQL计算QQ连续登陆天数
  18. 安卓网易云信实现仿QQ双方聊天界面功能(附UI界面
  19. 神经递质/核苷代谢物质靶向代谢检测
  20. threejs模型点击选中

热门文章

  1. jpadao层继承什么_ABP框架领域层
  2. mysql左连接丢失null值的问题
  3. 产品网络推广浅析网站在优化时文章标题撰写要注意哪些事项?
  4. 网络推广方法带你了解优质的网站结构对网站SEO有什么好处?
  5. 外包网络推广公司探索出高排名网站优化的技巧!
  6. 让关键词排名更稳定提升的优化技巧有哪些?
  7. 网站建设你够专业吗?——不需说,从色彩搭配就能看出来
  8. cad打开图纸流程图_如何打开cad图纸?cad怎么打开pdf的图纸?
  9. 不同的二叉搜索树-战胜100%的Java用户
  10. 如何创建和维护你自己的man手册