前两天跟老师去北京开了一个会议,好久没学习了,今天才回学校,其中的辛酸就不说了。来正文:

1、什么是文件共享

(1)、文件共享就是同一个文件(同一个文件指的是同一个inode,同一个pathname)被多个独立的读写体(几乎可以理解为多个文件描述符)去同时(一个打开尚未关闭的同时,另一个去操作)操作。

(2)、文件共享的意义有很多:例如我们可以通过文件共享来实现多线程同时操作同一个大文件,以减少文件读写时间,提升效率。

2、文件共享的3种实现方式

(1)、文件共享的核心就是怎么弄出来多个文件描述符指向同一个文件。

(2)、常见的有三种文件共享的情况:

第一种就是同一个进程中多次使用open打开同一个文件,多次使用open时的返回值不一样;(分别读/写)

第二种就是在不同进程中分别使用open打开同一个文件(这时候因为两个fd在不同的进程中,所以两个fd的数字可以相同也可以不同);(分别读/写)

第三种情况就是linux系统提供了dup和dup2两个API来让进程复制文件描述符。(接续读/写)

3、再论文件描述符

(1)、文件描述符的本质就是一个数字,这个数字本质上是进程表中文件描述符表的一个表项,进程通过文件描述符作为index去索引查表得到文件表指针,再间接访问得到这个文件对应的文件表。

(2)、文件描述符这个数字是open系统调用内部由操作系统自动分配的,操作系统分配这个fd时,也不是随意分配,也是遵照一定的规律的,我们现在就要研究这个规律。

(3)、操作系统规定,fd从0开始依次增加。fd也有最大限制的,在linux的早期版本中(0.11)fd最大是20,所以当时一个进程最多允许打开20个文件。linux中文件描述符表是个数组(不是链表),所以这个文件描述符表其实就是一个数组,fd是index,文件表指针是value。

(4)、当我们去open时,内核会从文件描述符表中挑选一个最小的未被使用的数字给我们返回。也就是说如果之前fd已经占满了0-9,那么下次我们open得到的一定是10。(但是如果上一个fd得到的是9,下一个不一定是10,这是因为可能前边一个更小的fd已经被close释放掉了)。

(5)、fd中0、1、2已经默认被系统占用了,因此用户进程得到的最小的fd就是3了。

(6)、linux内核占用了0、1、2这三个fd是有用的,当我们运行一个程序得到一个进程时,内部就默认打开了这三个文件,这三个文件对应的fd就是0、1、2。这三个文件分别叫stdin、stdout、stderr。也就是标准输入、标准输出、标准错误。

(7)、标准输入一般对应的是键盘(可以理解为:0这个fd对应的是键盘的设备文件)

标准输出一般是LCD显示器(可以理解为:1对应LCD的设备文件)

(8)、printf函数其实就是默认输出到标准输出stdout上了。stdio中还有一个函数叫fprintf,这个函数就可以指定输出到哪一个文件描述符中。

Linux文件共享的实现方式的更多相关文章

  1. Linux文件共享服务之Vsftp

    目录 FTP Vsftp服务的搭建 ftp.sftp.vsftp.vsftpd的区别 FTP FTP的工作原理: FTP会话时包含了两个通道,一个叫控制通道,一个叫数据通道.控制通道是和FTP服务器进 ...

  2. Linux文件共享服务之Samba

    目录 Samba Samba的配置 Samba Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,而SMB是Server Message Block的缩写,即为服务器消息块 ...

  3. 到底应该选择那种Linux.NET的部署方式?

    当前部署Linux.NET环境的方式可谓是五花八门,既有传统的源码编译的方式.又有各式各样的一键安装脚本.还有绿色包安装方式,而随着Mono官方的新站上线,更增加了采用RPM包的部署方式.那对于一名L ...

  4. 在Linux下的中断方式读取按键驱动程序

    // 在Linux下的中断方式读取按键驱动程序 //包含外部中断 休眠 加入poll机制 // 采用异步通知的方式 // 驱动程序发 ---> app接收 (通过kill_fasync()发送) ...

  5. Linux:Vmware安装linux虚拟机,桥接方式配置静态IP后重启网卡,提示:Error,some other host already uses address 10.252.252.21...

    问题: Vmware安装linux虚拟机,桥接方式配置静态IP后重启网卡,提示:Error,some other host already uses address 10.252.252.21... ...

  6. Windows与Linux文件共享

    Windows与Linux文件共享 Samba服务器 安装Samba服务器 rpm –ivh /mnt/Packages/Samba-3.5.10-125.el6.i686.rpm 添加用户并修改密码 ...

  7. Django项目部署在Linux下以进程方式启动

    Django项目部署在Linux下以进程方式启动 这是一篇关于如何在linux下,以后台进程的方式运行服务,命令改改基本上就通用了. 开发完Django项目后,需要把项目部署到linux环境下.当然, ...

  8. Linux操作系统常见安装方式

    Linux操作系统常见安装方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在window操作系统安装程序只需要点点鼠标就能搞定的事情,但是在Linux操作系统中,尤其是字符终端 ...

  9. Linux执行shell脚本方式及区别&命令后台运行

    Linux执行shell脚本方式及区别&命令后台运行 http://blog.csdn.net/heqiyu34/article/details/19089951/

随机推荐

  1. 图床工具PicGO实现七牛云图片上传

    图床工具PicGO实现七牛云图片上传 我们在写博客或者网络文章时经常需要上传图片.目前最有名气的图床工具就是PicGO. 简单的界面,完整的功能,在相册里也能直接复制markdown图片链接.一直深受 ...

  2. JAXB工具

    在JDK6之后,都自带了JAXB工具,所以在jdk类库与tomcat WEBAPP类库之间,会造成冲突 https://blog.csdn.net/iteye_13776/article/detail ...

  3. jquery播放mp3

    $("button").on("click",function(){    $('embed').remove();            $('body'). ...

  4. 【LeetCode】解码方法

    [问题] 一条包含字母 A-Z 的消息通过以下方式进行了编码:'A' -> 1'B' -> 2…'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 : 输 ...

  5. SpringCloud学习之Sleuth服务链路跟踪(十二)

    一.为什么需要Spring Cloud Sleuth 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元.由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很 ...

  6. c语言寒假大作战

    一.表格 问题 回答 这个作业属于那个课程 2019级计科一班 这个作业要求在哪里 寒假大作战01 这个作业的目标是 gitee注册.登录.上传文件.克隆仓库与 git基础命令学习与使用 作业正文 作 ...

  7. Jeesite 定时任务 Task

    转自 http://blog.lunhui.ren/archives/280 第一种方式 一. spring-context.xml配置加入 xmlns:task=”http://www.spring ...

  8. String类型不属于八种基本类型

    String不属于8种基本数据类型,String是一个对象.因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. new String( ...

  9. 归并排序(包含逆序数对的个数51Nod1019)

    归并排序是效率很好的排序方式,和快排效率一样高,但在稳定性上优于快排,下面我们来介绍归并排序. 归并排序运用递归将序列不断二分(其原理就是分治),就像一棵树不断向下分支,最后分到只剩一个元素,这样这个 ...

  10. spring boot 生命周期初探

    1.MytestApplication package com.gomepay; import org.springframework.boot.Banner; import org.springfr ...