Linux 文件系统(三)---dup和fork函数执行后的文件情况 http://blog.csdn.net/shanshanpt/article/details/39049579
来源:互联网 发布:当当网的网络广告宣传 编辑:程序博客网 时间:2024/05/10 12:24
Linux 文件系统(三)---dup和fork函数执行后的文件情况
对于dup和fork函数来说,前者是复制一个文件描述符,后者是复制进程,同时相关的文件信息也会被复制。
一、对于Dup
之前已经知道,对于一个进程来说,有一个files_struct来管理所有的相关文件,最终的反应形式其实就是一个文件数组而已:
所谓文件描述符就是数组下标。Dup函数总是从数组第一个元素开始扫描,获取第一个可用的文件描述符(也就是没有关联实际文件的fd),这就是所谓:dup总是使用最小的文件描述符。理解了原理就简单了。
一个Dup操作之后,变成什么情况呢?看下面的图:
例如:dup(fd[y]),从开头找到第一个可以的文件描述符(所谓最小描述符),现在可以发现fd[x]和fd[y]同时指向file!这个千万注意,两个文件描述符指向同一个文件和指向同一个file不一样,指向同一个文件可以是不同的file,但是inode永远唯一,但是此处,fd指向同一个file,那么任意一个操作,另一个一定是同步的!
常见例子:一般来说,初始化的时候,进程都拥有默认的三个文件描述符默认代表,标准输入,标准输出,标准错误。但是这不是硬性规定,你可以自己改呀!例如下面的代码:
close(0);
dup(fd[x]);/* 这是一个普通文件的文件描述符 */
这之后,你会发现,0号文件描述符关联上了这个文件(0是最小的文件描述符,所以肯定会被dup选中!)。
2、对于fork函数:
父进程fork之后,子进程和父进程共享父进程打开的文件,那么使用图示表现为:
父子进程有相同的文件fd,并且对应的fd指向相同的file。
常见例子:父子进程使用管道通信时候。在父进程中创建一个pair_pipe,也就是创建一个可以通信的两个文件,一个口用于写,一个用于读。那么fork之后,子进程中复制上面信息,也拥有和父进程相同的pair_pipe,其实指向的就是同一个文件,如下图:
现在关闭父进程的pair_pipe[0],关闭子进程的pair_pipe[1],那么父子进程分别使用pair_pipe[0]和pair_pipe[1]进行通信!
具体的通信图示如下:
版权声明:本文为博主原创文章,未经博主允许不得转载。
- Linux 文件系统(三)---dup和fork函数执行后的文件情况 http://blog.csdn.net/shanshanpt/article/details/39049579
- Linux 文件系统(三)---dup和fork函数执行后的文件情况
- Linux 文件系统(三)---dup和fork函数执行后的文件情况
- http://blog.csdn.net/shanshanpt/article/details/39852249
- iotcl函数(转自http://blog.csdn.net/shanshanpt/article/details/19897897)
- [置顶] linux中fork()函数详解 ) http://blog.csdn.net/jason314/article/details/5640969
- Linux管道编程技术:dup函数,dup2函数,open函数详解 http://blog.csdn.net/zhouhong1026/article/details/8151235/
- 使用dup和dup2重定向和还原 http://blog.csdn.net/kangear/article/details/24098315
- Linux--根文件系统的挂载过程分析 http://blog.csdn.net/guopeixin/article/details/5962482
- Linux内核大讲堂 (三) 解不开的"/"情结 http://blog.csdn.net/z2007b/article/details/6575809
- io.h头文件下的一些函数 http://blog.csdn.net/babygjx/article/details/5740038
- Linux-2.6 open()打开文件涉及的内核处理和数据结构分析 http://blog.csdn.net/ordeder/article/details/24420637
- linux下C获取文件的大小http://blog.csdn.net/gdujian0119/article/details/6363574
- Linux的system()和popen()差异 http://blog.csdn.net/liuxingen/article/details/47057539
- Linux虚拟文件系统(概述) http://blog.csdn.net/bullbat/article/details/7241273
- [置顶] 《Linux启动过程分析》内核挂载根文件系统 http://blog.csdn.net/tankai19880619/article/details/12093239
- 《Linux内核编程》第四章:proc文件系统 http://blog.csdn.net/tankai19880619/article/details/8032204
- 使用 /proc 文件系统来访问 Linux 内核的内容 http://blog.csdn.net/diy534/article/details/6802311
- Linux内核工程导论——网络:Socket
- iOS多线程学习之NSOperation(三)
- 原子操作与混杂设备
- Linux内核工程导论——网络:内核特性
- 矩阵计算工具——Eigen的简单用法
- Linux 文件系统(三)---dup和fork函数执行后的文件情况 http://blog.csdn.net/shanshanpt/article/details/39049579
- 什么是黑盒测试法?它的常用方法有哪些?
- Android 模仿手机QQ表情输入和表情预览框
- 音频的播放、简单音乐播放器
- 使用Python实现Hadoop MapReduce程序
- MARK一下,nodejs 使用session
- 设置前面板对象的Tab键顺序
- 软件常用语
- Adapter适配器模式