一、文件共享

  内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。

  1、每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述表
  2、内核为所有打开文件维持一张文件表
  3、每个打开文件都有一个v节点结构,v节点包含了文件类型和对此文件进行各种操作的函数的指针。PS:Linux中没有使用v节点,而是使用了通用i节点结构。

  

  文件描述符标志只用于一个进程的一个描述符

  文件状态标志适用于指向该给定文件表项的任何进程中的所有描述符

二、原子操作

  1、pread函数和pwrite函数

    #include <unistd.h>
    ssize_t pread(int fd,        //要读取数据的文件描述符

           void *buf,      //数据缓存区指针,存放读取出来的数据

           size_t nbytes,    //读取数据的字节数

           off_t offset      //读取的起始地址的偏移量,读取地址=文件开始+offset

           );          //返回值:读到的字节数,若已到文件结尾则返回0,若出错则返回-1

    ssize_t pwrite(int fd,          //要写入数据的文件描述符

           const void *buf,    //数据缓存区指针,存放要写入文件中的数据

           size_t nbytes,    //写入数据的字节数

           off_t offset      //写入起始地址的偏移量,写入地址=文件开始+offset

           );          //返回值:若成功则返回已写的字节数,若出错则返回-1

    调用pread相当于顺序调用lseek和read,但是调用pread时,无法中断其定位和读操作,且不更新文件指针。

    调用pwrite相当于顺序调用lseek和write。

  2、原子操作指的是由多步组成的操作,如果该操作原子地执行,则要么执行完所有步骤。要么一步也不执行,不可能只执行所有步骤的一个子集。

三、dup和dup2函数

    #include <unistd.h>
    int dup(int fd);           //返回的新文件描述符一定是当前可用文件描述符的最小数值
    int dup2(int fd,int fd2);         //用fd2参数指定新描述符的数值

    两个函数都可用来复制一个现存的文件描述符,两函数的返回值:若成功则返回新的文件描述符,若出错则返回-1。

    这两个函数的用处:返回的新文件描述符与参数fd共享一个文件表项,达到共享一个文件状态标志(读、写、添加等)以及同一当前文件偏移量。如下图所示:

四、sync、fsync和fdatasync函数

  虽然延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。sync、fsync和fdatasync函数可以保证磁盘上实际文件系统与缓冲区高速缓存中内存的一致性。

  #include <unistd.h>
  int fsync(int fd);
  int fdatasync(int fd);        //这两个函数的返回值:若成功则返回0,若出错则返回-1

  void sync(void);

  fsync :只对由文件描述符fd指定的单一文件起作用,并且等待写磁盘操作结束,然后返回
  fdatasync :只影响文件的数据部分,而除数据外,fsync还会同步更新文件的属性
  sync :只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写盘操作结束

  

五、fcntl函数 

  #include<fcntl.h>

  int fcntl(int fd,int cmd,int arg);    //返回值:若成功则依赖于cmd,若出错则返回-1

  fcntl函数有5种功能:1、复制一个现有的描述符 cmd=F_DUPFD

            2、获得/设置文件描述符标记 cmd=F_GETFD或F_SETFD

            3、获得/设置文件状态标志 cmd=F_GETFL或F_SETFL

            4、获得/设置异步I/O所有权 cmd=F_GETOWN或F_SETOWN

            5、获得/设置记录锁 cmd=F_GETLK、F_SETLK或F_SETLKW

转载于:https://www.cnblogs.com/mengfanxiao/p/4479745.html

Linux学习笔记11——文件I/O之二相关推荐

  1. Linux学习笔记---使用BusyBox创建根文件系统(二)

    目录 向 rootfs 的"/lib "目录添加库文件 向 rootfs 的usr/lib 目录添加库文件 创建其他文件夹 根文件系统初步测试 向 rootfs 的"/l ...

  2. Linux学习笔记---移植官方uboot步骤(二)

    在上一篇 Linux学习笔记---移植官方uboot步骤(一) 自己的uboot已经编译成功了,接下来继续移植LCD驱动和网络驱动. 修改LCD驱动 修改配置参数 打开my_uboot/board/f ...

  3. Linux学习笔记十三——文件压缩、解压缩和归档

    压缩.解压缩命令: 1.compress/uncompress:压缩格式为Z,文件后缀为.Z compress /path/to/file uncompress /path/to/file.Z 2.g ...

  4. Linux学习笔记11——远程拷贝命令scp

    远程拷贝命令scp scp就是secure copy,是一个在Linux下用来进行远程拷贝文件的命令 它的地址格式与ssh基本相同,需要注意点是,在指定端口时用的是大写的-P而不是小写 # 把本地当前 ...

  5. Linux学习笔记——修改文件的所有者和所有组

    文章目录 chown命令 chgrp 命令 chown命令 Linux chown(英文全拼:change owner)命令用于设置文件所有者和文件关联组的命令. Linux/Unix 是多人多工操作 ...

  6. Linux学习笔记6 文件操作——文件描述符

    基于文件描述符的文件操作 进程一启动,内核就打开了三个描述符,0(标准输入 STDIN),1(标准输出STDOUT), 2(标准错误输出STDERR).Linux用整形数做文件操作,因此称为文件描述符 ...

  7. 烧写文件系统——韦东山嵌入式Linux学习笔记11

    本文实验环境: 1. windows 7(64bit) 2. JZ2440(V2) 使用 u-boot 烧写文件系统,一般有两种方法. 1. 通过USB下载功能 2. 通过TFTP功能 通过USB下载 ...

  8. 兄弟连Linux学习笔记之文件处理命令

    1 目录处理命令: ls -a #显示所有文件 -l #长格式显示 -d #只显示目录 -h #人性化显示 -i #查看i节点 mkdir # 创新新目录-p # 递归创建子目录 cd # 切换目录 ...

  9. linux学习笔记yum源.repo文件的理解

    linux学习笔记 repo文件是yum 源( 软件仓库 )的 配置 文件,通常一个repo文件定义了一个或者多个软件仓库的细节内容(记录了包的下载路径,相当于寻宝图,告诉yum去哪里寻找将要下载的软 ...

最新文章

  1. Java 7代码层面上的更新
  2. 他89岁,拿下人生第3个博士学位,横跨医学物理学,只为“实现儿时梦想”
  3. 算法刷题-数论-质数的判定、分解质因数、筛质数
  4. 一个简单的epoll测试例子
  5. linux清空文件内容的几种方式与区别
  6. 车主无忧:为什么放弃开源Kafka?
  7. 最简单的基于librtmp的示例:发布H.264(H.264通过RTMP发布)
  8. tomcat怎么平滑更新项目_tomcat_deploy 平滑启动脚本
  9. 大数据技术原理与应用-概述
  10. 出发a标签_以用户标签为例,复盘B端产品的需求挖掘方法论
  11. 通讯频道:TOM续约Skype破镜重圆
  12. 程序员被HR女友甩:不加班,没上进,没前途
  13. [原创]有关PHP 中 MVC的个人见解
  14. Part Six 地理定位API
  15. BZOJ4568 [Scoi2016]幸运数字
  16. (day 24 - 广度优先搜索 )剑指 Offer 32 - I. 从上到下打印二叉树
  17. 微信小程序入门指南——程序员计算器设计(一)
  18. Android四大组件详解
  19. mysql酒店客房管理系统的设计_《酒店客房管理系统设计》总结
  20. 云服务器需要芯片吗,什么时候手机不再需要芯片——计算云端化是不可逆转的未来...

热门文章

  1. 【51Nod - 1163】最高的奖励 (贪心+优先队列 或 妙用并查集)
  2. 无法设置html过渡效果,html – CSS3过渡显示无阻止过度滚动
  3. vue 模板 html 表达式,Vue 模板template、指令directive、修饰符
  4. 三星电视出现服务器未响应,三星电视遥控器失灵怎么办
  5. java 字符串包含某个字符_java中判断字符串中是否包含某个特定字符串的方法有哪些...
  6. mysql 优化表_mysql里sql优化和表结构优化
  7. 初学多线程使用中踩过的坑
  8. python基础技巧总结(四)
  9. 推荐系统(4)-逻辑回归LR、POLY2、FM、FFM
  10. Python模块(3)--PIL 简易使用教程