1.文件共享

内核使用3种数据结构来表示打开的文件,他们的关系如下:
每个进程都有一张进程表项,记录进程打开的文件:
fd标志:close_on_exec,若一个文件描述符在close_on_exec中的对应比特、位被设置,那么在执行execve()时该描述符将被关闭,
否则该描述符将始终处于打开状态。
文件指针:指向文件表。
文件表:
文件状态标志:read,write,append,sync等,即open的
flag参数。
当前文件偏移量:当执行了write后,当前文件偏移量就增加了相应的长度,如果偏移量超过了文件的长度,则将i节点表中的当前
文件长度设置为文件偏移量。当使用O_APPEND打开文件后,首先将文件偏移量设置为i节点表中的当前文件长度。
v节点指针:指向v节点表。

v节点表:
v节点包含了文件类型和对此文件进行各种操作的函数指针。
v节点还包含了该文件的i节点(i-node)。
(linux没有使用v节点,只使用了通用i节点结构,这2种实现上有所不同,但是概念上是一样的)

上图表示一个进程打开了2个不同的文件,一个是标准输入,一个是标准输出。
下图表示2个不同的进程打开同一个文件。


2.dup和dup2函数

这2个函数是用来复制一个现存的文件描述符,函数的定义如下:
#include <unistd>
int dup(int filedes); //复制filedes,并返回新的filedes(该文件描述符是当前可用文件描述符中最小值),如出错,返回-1
int dup2(int filedes, int filedes2);
//使用filedes2复制filedes,如果filedes2已经打开,则先关闭它;如果filedes等于filedes2,则返回filedes2,而不关闭它。

下图显示了执行如下语句的结果:(假设当前可用文件描述符的最小值是3)
newfd = dup(1);




复制一个文件描述符的另一种方法是使用fcntl函数,这个函数会在以后进行介绍。


《UNIX环境高级编程》笔记--文件共享的更多相关文章

  1. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...

  2. UNIX环境高级编程笔记 目录

    每一章的重点会使用加粗字体 第一章:UNIX基础知识:UNIX体系结构:文件和目录:输入和输出:程序和进程:出错处理:信号:时间值:系统调用和库函数 第三章:文件I/O:文件描述符:文件操作函数:文件 ...

  3. UNIX环境高级编程笔记之高级I/O

    本章说明了很多高级I/O功能: 非阻塞I/O——发一个I/O操作,不使其阻塞,记录锁,STREAMS机制 I/O多路转接——select和poll函数 readv和writev函数,以及存储映射I/O ...

  4. UNIX环境高级编程笔记之线程

    本章涉及到线程的一些基本知识点,讨论了现有的创建线程和销毁线程的POSIX.1原语,此外,重点介绍了线程同步问题,讨论了三种基本的同步机制:互斥量.读写锁.条件变量.

  5. UNIX环境高级编程笔记之进程控制

    本章重点介绍了进程控制的几个函数:fork.exec族._exit.wait和waitpid等,主要需要掌握的是父进程和子进程之间的运行机制,怎么处理进程的正常和异常终止.以及怎么让进程执行不同的程序 ...

  6. UNIX环境高级编程笔记之进程环境

    本章讲的都是一些非常基础的知识,目的是为了下一章讲进程控制做铺垫,所以,本章就不做过多的总结了,直接看图吧.

  7. UNIX环境高级编程笔记之标准I/O库

    一.总结 文件I/O一章讲了不带缓冲的I/O,本章讲的是带缓冲的I/O.不带缓冲针对的是内核的系统调用,而带缓冲针对的是用户空间的标准库函数,是基于带缓冲的I/O实现的.不带缓冲的I/O通过文件描述符 ...

  8. 《unix环境高级编程》学习笔记【原创】

    本文基于unix环境高级编程的学习的笔记,写的比较简如有不对,欢迎指点. 简单的描述下面函数的功能改变ctr+c信号原本的作用终止程序,在按下中断键的时候输出一句话. while循环主要读取用户的输入 ...

  9. 《UNIX环境高级编程》(APUE) 笔记系列

    本系列笔记主要是对于 <UNIX环境高级编程>(APUE) 各章节内容 概念性的总结 ,不涉及代码解读 . 目录 : 第一章 UNIX基础知识 第二章 UNIX标准及实现 第三章 文件I/ ...

  10. [置顶] 文件和目录(二)--unix环境高级编程读书笔记

    在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...

随机推荐

  1. 浅谈HtmlUnit的使用

    一.htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容.项目可以模拟浏览器运行,被誉为java浏览器的开源实现.这个没有界面的浏览器,运行 ...

  2. JavaSE思维导图(一)

  3. 如何调试webservice接口是否正常

    soapui 调试webservice接口 1首先iis 部署网站 2添加webservice 3附加到进程调试  找w开头的 4然后request填充数据

  4. Oracle分析函数之开窗子句-即WINDOWING子句

    Oracle的分析函数,对我们进行统计有很大的帮助,可以避免一些子查询等操作,在统计中,我们对开窗函数的接触较少,下面主要介绍下开窗函数的使用; http://www.itpub.net/thread ...

  5. java 中有几种方法可以实现一个线程? 用什么关键字修 饰同步方法? stop()和 suspend()方法为何不推荐使用?

    java5 以前, 有如下两种:第一种:new Thread(){}.start();这表示调用 Thread 子类对象的 run 方法, new Thread(){}表示一个Thread 的匿名子类 ...

  6. IOS自学笔记1——学前准备

    函数的声明和定义: 在标准的C编译器中,定义的函数只能调用前面已经定义的函数.若在main()函数里要调用其他方法,这时得首先在main()上面声明要调用的函数,即函数的声明. C语言中,函数的声明和 ...

  7. javascript小练习—函数接收参数并弹出

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  8. css3图片3D翻转效果

    点击图片看翻转效果 html结构 <div class="flip"> <div class="front"> <img src= ...

  9. Rem & Viewport

    Rem布局 rem就是给根元素设置一个基准值 然后其他元素都以这个基准值作为单位 那么就可以在不同的手机上做出相同比例的元素了 事实上和百分比是同样的道理 网易和淘宝的rem 参考 http://ww ...

  10. ExtJS 自定义组件

    主要参考的是官方文档 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...