dup函数分析及应用场景_dup函数作用-程序员宅基地

技术标签: Unix/Linux环境编程  

dup应用场景分析

Unix系统中支持不同的进程共享的打开文件,dup函数可以复制一个现有的文件描述符,这里的“复制”不是说dup返回完全一样的文件描述符,那是没有意义的。而是返回一个当前可用文件描述符中的最小数值,通过这一新的文件描述符也可以访问该文件。

“共享”的分析

上面提到了“共享”,对于刚接触文件描述符的人来说,可能会有些疑问,为什么要“共享”,将文件描述符作为一个“全局变量”访问不是很方便吗?有这种想法的,往往是因为我们大多数情况下的应用范围都是仅限于1个进程,即便1个进程下有多个线程,对于单进程引用而言,其实是没有“共享”的概念的,因为没有意义,单进程下的所有进程都可以访问同一个文件描述符,当然这个文件描述符必须是全局定义的。所以“共享”仅限于不同进程之间对同一个文件的共享访问。就比如说,在电脑上运行一个QQ,再运行一个微信,同时访问某一个文件,这就是不同进程共享访问那个文件。这里我们再稍微强调一下:
我们所说的文件共享,不是一般意义上的两个进程可以对同一个文件进行读写,而只是共享同一个文件表,也就是共享这个文件的当前偏移量、文件状态标志等信息。

打开的文件在内核中的数据结构

打开文件的内核数据结构
从上图我们可以了解到:
(1)每个进程在进程表中都有一个记录项,记录项包含了一张打开的文件描述符表,该文件描述符表中记录了每个打开文件的文件描述符和指向一个文件表的指针。
(2)内核为每个打开文件维持一个文件表,其中包含文件状态标志、当前文件偏移量和v节点指针。
(3)每个打开的文件都有一个v节点,其中包含了i节点信息,文件类型等。

不使用共享机制,两个进程打开一个相同文件

两个独立的进程各自打开同一个文件
上图中我们可以看到,两个进程(A和B)都打开同一个文件,那么每个进程都会有自己的文件表,每个进程也都拥有他们关于该文件的自己的文件状态标志,这里要知道,几乎在任何操作系统下,不同进程的地址空间都是完全不同的,所以即便两个进程下的文件描述符是一样的,但是一个进程下的文件状态变化,在另一个进程下是不变的,这就会导致数据不同步或者数据被覆盖,比如:
A进程此时调用read读取3个字节,那么A进程所关联的文件表中的当前文件偏移更新为三,但是因为B进程也拥有它自己的关于该文件的文件表,那么对B进程来说当前文件偏移量仍旧是在文件头处。与A进程无关,他们互不影响。这也是造成进程间数据覆盖的原因。因为A进程写了数据到文件中只影响了自己的文件表而不影响B进程的文件表。那么B进程写数据到文件时就会从头开始写造成数据被覆盖。

为了实现不同进程之间共享文件,使用dup()

为了解决上面提到的不同进程之间文件共享的需求,unix提供了dup()功能,
dup原型如下:

int dup(int fd);

由dup返回的新文件描述符是当前可用文件描述符中最小数值。执行dup函数后的内核结构如下图所示:
执行dup后的内核结构

进程之间传递文件描述符

如果在B进程中直接调用dup进行赋值某一个文件描述符,dup函数会出错的,原因还是不同进程之间是完全隔离的,直接复制同样的描述符是没有任何意义的,那么如何让两个不同的进程之间进行文件描述符传递呢,这就要用到IPC机制,也就是进程通信机制了,并且调用ioctl函数,关于进程同步,就非常复杂和专业了,这里就不做详解了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012351051/article/details/106307164

智能推荐

京东php面试题_【京东队列分布式面试题】面试问题:php… - 看准网-程序员宅基地

参考:https://segmentfault.com/a/1190000010262869GCPHP 5的内存回收原理?请详细描述ZendMM的工作原理PHP 7的垃圾回收和PHP 5有什么区别?https://blog..net/yangxuesong5555/article/details/79417264结构PHP 7中对zVal做了哪些修改?PHP 7中哪些变量类型在栈,哪些..._php面试队列

ISO 18184纺织品抗病毒活性的测定_iso18184-程序员宅基地

ISO 18184 Textiles—Determination of antiviral activity of textile productsISO 18184纺织品--纺织品抗病毒活性的测定ISO 18184纺织品抗病毒活性的测定—标准简介本文件规定了测定纺织产品抗特定病毒抗病毒活性的试验方法。由于个体敏感性,一种测试病毒的结果不能转换为其他病毒。纺织产品包括机织物和针织物、纤维、纱线、编织物等。ISO 18184纺织品抗病毒活性的测定—检测范围普通病毒:H3_iso18184

2013年1月18日调试触发器“表发生了变化,触发器或函数不能读它”的出现原因,以及解决方案...-程序员宅基地

1、异常出现的场景.:在使用Hibernate做为项目持久层的情况下,需要对某一张表进行一个扩展,扩展操作便是在该表上创建一个触发器。将表中的数据读入到其他表中。SQL语句如下:droptabletr_table; createtabletr_table(--触发器作用表 tab_idnumberprimarykey, tab_name...

webpack-dev-server的 常用命令参数01-程序员宅基地

自动打开浏览器"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "webpack-dev-server --open", "build": "webpack --mode production"在dev 执行命令里 使用webpack-dev-serve...

lombok整合log4j打印日志_lombok log4j-程序员宅基地

lombok整合log4j打印日志POMlog4j.properties测试POM<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version&g_lombok log4j

随便推点

解决error: (-215:Assertion failed) _src.empty() in function ‘cv::cvtColor‘_error: (-215:assertion failed) !_src.empty() in fu_BIGBOSSyifi的博客-程序员宅基地

解决error: -215:Assertion failed !_src.empty in function 'cv::cvtColor'问题所在解决总结问题所在在OpenCV环境下,运行代码时出现:error: -215:Assertion failed !_src.empty in function 'cv::cvtColor'原因是:cv::cvtColor中无对象资源解决定位到代码问题所在行,发现imgRGB没有被传入图像我的代码传入图像是从摄像头中传入,继续定位到cap这里,_error: (-215:assertion failed) !_src.empty() in function 'cv::cvtcolor

Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors-程序员宅基地

tomcat进行http request解析的时候报错,并将错误返回给客户端了,具体的错误如下:org.apache.coyote.http11.AbstractHttp11Processor.processError parsing HTTP request headerNote:further occurrences of HTTP header parsing errors will be ..._error parsing http request header note: further occurrences of http request

WinForm窗体程序 主窗体开启和关闭动画效果_winform 窗体特效_小丫头呀的博客-程序员宅基地

某些程序会有弹窗,在屏幕右下角缓缓出来,又缓缓关闭,这类效果自然使用原生态的API最合适不过了首先API声明:/// <summary>/// 窗体动画函数/// </summary>/// <param name="hwnd">指定产生动画的窗口的句柄</param>/// <param name="dwTime">指定动画持续的时间</param>/// <param name="dwFlags">指_winform 窗体特效

java.sql.SQLException: Protocol violation解析-程序员宅基地

之前连接oracle数据库总是连接不上,再三检查代码没发现问题,最后看到java.sql.SQLException: Protocol violation 感觉是jdbc jar包出了问题,于是更换了jar包,果然连接再也没报错了。这里附录网上摘抄的关于ojdbc版本的资料,有需要的小伙伴可以了解下。 classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar..._protocol violation

用java调用oracle存储过程和函数-程序员宅基地

( PARA1 IN VARCHAR2, PARA2 IN VARCHAR2)ASBEGIN INSERT INTO USER (I_ID,I_NAME ) VALUES (PARA1, PARA2 );END TESTA; 2,Java程序:package com.hyq.src;public class TestProcedureOne { public TestProcedureOne() { } public static vo

后端分布式系列:分布式存储-MySQL 数据库事务与复制_mysql分布式存储-程序员宅基地

好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适。最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类。结合实际工作中碰到的问题,以寻找答案的方式来剖解技术,很多时候我们都不是在创造新技术,而是在应用技术。为了更有效率与效果的用好技术,我们需要了解一些技术的原理与工作方式。带着问题从使用者的角度去剖析技术原理,并将开源技术产品和框架作为一类技术的参考_mysql分布式存储