一、文件共享

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

  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

Linux学习笔记11——文件I/O之二的更多相关文章

  1. Linux 学习笔记 5 文件的下载、压缩、解压、初步认识yum

    写在前面 上节我们通过简单的几组命令,已经完全的实现了文件的移动.删除.更名.以及复制,我们最常用的基本玩法,本节将带着大家学习压缩.解压的相关步骤. Linux 学习笔记 4 创建.复制.移动.文件 ...

  2. Linux学习笔记之文件权限

    前言: 说起文件权限,大家在windows下应该很熟悉就对文件右键属性,然后配置一点什么读写之类的权限,然后可以分配到每个的人. 对于linux 我先为大家介绍一个使用者和组和其他的概念说明一下 文件 ...

  3. Linux学习笔记 -- 话说文件

    文件基本属性 Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限.为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定. 在Li ...

  4. python学习笔记(11):文件的访问与函数式编程

    一.文本文件读写的三种方法 1.直接读入 file1 = open('E:/hello/hello.txt') file2 = open('output.txt','w') #w是可写的文件 whil ...

  5. Linux学习笔记05—文件与目录权限

    1. 绝对路径与相对路径绝对路径:路径的写法一定由根目录 ‘/’写起,例如 /usr/local/mysql 这就是绝对路径相对路径:路径的写法不是由根目录 ‘/’写起,例如:首先用户进入到/, 然后 ...

  6. linux 学习笔记之文件与管理

    前言: 对于windows来说,文件的系统管理都是非常简单的(这个应该有一个捂脸),通常就是重命名,复制,移动,删除,查看文件属性,查看文件内容,寻找文件.其实在图形化行中的linux也是有这样子功能 ...

  7. linux学习笔记一----------文件相关操作

    一.目录结构 二.文件管理操作命令(有关文件夹操作,使用Tab键自动补全文件名(如果多个默认第一个)) 1.ls 查看目录信息:ls -l 查看目录详细信息(等价于ll 某些系统不支持) 2.pwd ...

  8. linux学习笔记之文件类型,及目录介绍

    引用A:http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/20/3033131.html 引用B:http://www.cnblogs.c ...

  9. linux学习笔记-3.文件相关命令

    1.进入到用户根目录 cd ~ 或者 cdcd ~hadoop回到原来路径cd - 2.查看文件详情 stat a.txt 3.移动 mv a.txt /ect/改名mv b.txt a.txt移动并 ...

随机推荐

  1. sql server split函数

    --创建分割函数CREATE FUNCTION dbo.Split(@String varchar(8000),@Delimiter char(1))returns @temptable TABLE ...

  2. JAVA 相关资料

    在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平. Java程序员 高级特性 反射.泛型. ...

  3. 01-Objective-C

    前言   目 前来说,Objective-C(简称OC)是iOS开发的核心语言,在开发过程中也会配合着使用C语言.C++,OC主要负责UI界面,C语言.C++ 可用于图形处理.近来,流传Ruby.C# ...

  4. jQuery 遍历后代

    后代是子.孙.曾孙等等. 通过 jQuery,您能够向下遍历 DOM 树,以查找元素的后代. 向下遍历 DOM 树 下面是两个用于向下遍历 DOM 树的 jQuery 方法: children() f ...

  5. Eclipse不能自动编译 java文件,不会生成CLASS

    每次修改类代码后都得重启 Tomcat 花了1天终于解决,网上所说基本是下面1和2的方法,使用之后还是不行最后重新建工作环境导入项目对比了一下找到第三种方法 1.Project 下有个 "B ...

  6. boost::xml——基本操作以及中文乱码解决方案 (续)

    本博文主要想说明以下两点: 1.对于上一篇的<boost::xml——基本操作以及中文乱码解决方案>解释,这篇博文基本解决了正确输入输出中英文问题,但是好像还没有解决修改中文出现乱码的问题 ...

  7. PHP设计模式之:建造者模式

    建造者模式: 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式; 目的: 消除其他对象复杂的创建过程 结构图: 优点: 建造者模式可以很好的将一个对象的实现与相关的“业 ...

  8. [Machine Learning] 梯度下降(BGD)、随机梯度下降(SGD)、Mini-batch Gradient Descent、带Mini-batch的SGD

    一.回归函数及目标函数 以均方误差作为目标函数(损失函数),目的是使其值最小化,用于优化上式. 二.优化方式(Gradient Descent) 1.最速梯度下降法 也叫批量梯度下降法Batch Gr ...

  9. Android 中 View移动总结:ViewDragHelper学习及用法详解

    如上图简单呈现出两个方块后,提出一个需求: 1.拖动方块时,方块(即子View)可以跟随手指移动. 2.一个方块移动时,另一个方块可以跟随移动. 3.将方块移动到左边区域(右边区域)后放开(即手指离开 ...

  10. 精通 Oracle+Python,第 3 部分:数据解析

    进行数据解析的理由不计其数,相关的工具和技巧也同样如此.但是,当您需要用这些数据做一些新的事情时,即使有“合适的”工具可能也是不够的.这一担心对于异类数据源的集成同样存在.用来做这项工作的合适工具迟早 ...