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. 部署WSP出现错误—已在此服务器场中安装ID为XXXXX的功能

    stsadm -o deploysolution -name ***.wsp -immediate -allowGacDeployment -url http://*** -force   

  2. jquery validate.addMethod 正则表达式 (自定义验证方法)

    项目中使用的jQuery添加的校验的方法 $(document).ready(function(){         5           6/* 设置默认属性 */         7$.vali ...

  3. java项目打jar包

    首先 在工程中,右键项目,有个export,选择JAR File,就能导出jar包. 一.java项目没有导入第三方jar包 1. 首先在Eclipse中打开项目, 右键点击项目,选择“Export” ...

  4. PHP 单列模式实例讲解以及参考网址

    1,http://blog.csdn.net/jungsagacity/article/details/7618587 2,http://www.cnblogs.com/lh460795/archiv ...

  5. 关于"cin>>"输入成功或失败时的“返回值”(转载)

    今天在看c++primer的时候,读到其中这样一段话: When we use an istream as a condition, the effect is to test the state o ...

  6. hdu 1524 A Chess Game 博弈

    题目链接 给出一个有向无环图, 上面放有一些棋子, 两个人轮流移动棋子, 当一个人无法移动时, 算输. 求出每一个点的sg值, 异或就可以.出度为0的点sg值为0. #include<bits/ ...

  7. [C++]Infinite House of Pancakes——Google Code Jam 2015 Qualification Round

    Problem It’s opening night at the opera, and your friend is the prima donna (the lead female singer) ...

  8. SMTP邮件传输协议发送邮件和附件

    在以前接触的项目中,一直都是在做网站时用到了发送mail 的功能,在asp 和.net 中都有相关的发送mail 的类, 实现起来非常简单.最近这段时间因工作需要在C++ 中使用发送mail 的功能, ...

  9. FTL(Flash translation layer)闪存转换层

    前面说过,闪存的读写单位为页,而页的大小一般为4KB或8KB,但我们的操作系统读写数据是按HDD的扇区尺寸进行的(512Byte(字节)),更麻烦的是闪存擦除以块作单位,而且未擦除就无法写入,这导致操 ...

  10. 10个必备的移动UI设计资源站

    http://www.uisdc.com/10-necessary-mobile-ui-design-resources# 交互设计中如何增加趣味性.提升愉悦http://www.uisdc.com/ ...