UNIX IO---再谈文件描述符

子进程继承父进程文件描述符导致父进程打开设备文件失败 多线程,子进程,system 阅读详情

原文地址:http://keren.blog.51cto.com/720558/170822/

在C程序中,文件由文件指针或者文件描述符表示。ISO C的标准I/0库函数(fopen, fclose, fread, fwrite, fscanf, fprintf等)使用文件指针,UNIX的I/O函数(open, close, read, write, ioctl)使用文件描述符。下面重点来说下,文件描述符是如何工作的。
 
文件描述符相当于一个逻辑句柄,而open,close等函数则是将文件或者物理设备与句柄相关联。句柄是一个整数,可以理解为进程特定的文件描述符表的索引。先介绍下面三个概念,后面讲下open、close等操作以后,文件和文件描述符产生什么关系,以及fork后文件描述符的继承等问题。
 
文件描述符表:用户区的一部分,除非通过使用文件描述符的函数,否则程序无法对其进行访问。对进程中每个打开的文件,文件描述符表都包含一个条目。
 
系统文件表:为系统中所有的进程共享。对每个活动的open, 它都包含一个条目。每个系统文件表的条目都包含文件偏移量、访问模式(读、写、or 读-写)以及指向它的文件描述符表的条目计数。
 
内存索引节点表: 对系统中的每个活动的文件(被某个进程打开了),内存中索引节点表都包含一个条目。几个系统文件表条目可能对应于同一个内存索引节点表(不同进程打开同一个文件)。
 
1、举例: 执行myfd = open( "/home/lucy/my.dat", O_RDONLY); 以后,上述3个表的关系原理图如下:
http://keren.blog.51cto.com/
                                                                                  图1
 
系统文件表包含一个偏移量,给出了文件当前的位置。若2个进程同时打开一个文件(如上图A,B)做读操作,每个进程都有自己相对于文件的偏移量,而且读入整个文件是独立于另一个进程的;如果2个进程打开同一个文件做写操作,写操作是相互独立的,每个进程都可以重写另一个进程写入的内容。
 
如果上面进程在open以后又执行了close()函数,操作系统会删除文件描述符表的第四个条目,和系统文件表的对应条目(若指向它的描述符表唯一),并对内存索引节点表条目中的计数减1,如果自减以后变为0,说明没有其他进程链接此文件,将索引节点表条目也删除,而这里进程B也在open这个文件,所以索引节点表条目保留。
 
2、文件描述符的继承
通过fork()创建子进程时,子进程继承父进程环境和上下文的大部分内容的拷贝,其中就包括文件描述符表。
 
(1)对于父进程在fork()之前打开的文件来说,子进程都会继承,与父进程共享相同的文件偏移量。如下图所示(0-1-2 表示 标准输入-输出-错误):
                                  图2 fork()之前打开my.dat
 
系统文件表位于系统空间中,不会被fork()复制,但是系统文件表中的条目会保存指向它的文件描述符表的计数,fork()时需要对这个计数进行维护,以体现子进程对应的新的文件描述符表也指向它。程序关闭文件时,也是将系统文件表条目内部的计数减一,当计数值减为0时,才将其删除。
 
(2)相反,如果父进程先进程fork,再打开my.dat,这时父子进程关于my.dat 的文件描述符表指向不同的系统文件表条目,也不再共享文件偏移量(fork以后2个进程分别open,在系统文件表中创建2个条目);但是关于标准输入,标准输出,标准错误,父子进程还是共享的。
                      图3   fork()以后打开my.dat

ptrade从零开始学习量化交易第166期【ptrade量化策略研究参考--三个因子挖掘思路】 三个因子挖掘思路 阅读详情

相关推荐

Exchange 2013/2016/2019修改附件大小限制

Exchange 2013/2016/2019邮件大小限制 可以在三个位置上配置Exchange上的默认邮件大小限制: 组织传输设置 发送/接收连接器设置 用户邮箱设置 1.打开Exchange Management Shell 使用命令查看默认限制 get-transportconfig | ft maxsendsize, maxreceivesize get-receiveconnector | ft name, maxmessagesize get-sendconnector | ft

高级基础架构专家-Hunter 6094

fork 子进程不继承父进程打开的文件描述符

昨天面试被问到了这个问题,没有回答上来,网上找了一下答案。解决方法是使用 clone 系统调用使用参数在复制时将父进程资源有选择地复制给子进程。下面介绍 fork vfork clone 三者的区别vforkvfork系统调用不同于fork,用vfork创建的子进程与父进程共享地址空间,也就是说子进程完全运行在父进程的地址空间上,如果这时子进程修改了某个变量,这将影响到父进程。因此,上面的例子如果改

conding_算子 8982

别再只设接触压力了!用ANSYS Workbench模拟O型圈密封泄漏的完整流程

本文详细介绍了在ANSYS Workbench中模拟O型圈密封泄漏的完整流程,重点解析了流体渗透压力载荷的设置与应用。通过双物理场耦合模型和精确的参数配置,帮助工程师准确评估密封性能,避免传统方法仅考虑接触压力的局限性。文章还提供了常见问题的解决方案和工程实践建议,提升密封设计的可靠性。

weixin_30372371的博客 398

fork的坑:文件描述符继承

​最近遇到一个神奇的fork问题,坑了我2天半的时间,最后在另一个小伙伴的帮助下,找到问题根源,然后修改。此时,对于前人说的,fork的坑,也终于有点认识了。 基本的软件图如下: 主进程A收到云端B的命令,fork出子进程A1、A2、….、An,然后执行execv函数,打开新的可执行文件。Execv执行完成后,子进程Ai就拥有了和主进程A不同的镜像文件,这是Linux下创建新进程的典型方式。 主进程A收到云端的控制信令后,通过socket与子进程Ai通信:控制Ai,收集Ai...

u014023993的专栏 4290

Keil5安装多版本共存方案:实用技巧分享

分享Keil5安装过程中实现多版本共存的实用方法,解决开发环境冲突问题。通过合理配置路径与版本管理,让keil5安装更高效稳定,提升嵌入式开发体验。

weixin_42514750的博客 1523

WPS和Excel通用!省市区四级联动下拉菜单保姆级教程(附最新行政区划数据包)

本文详细介绍了在WPS和Excel中实现省市区四级联动下拉菜单的完整教程,包含2024年最新行政区划数据的获取与整理方法。通过名称管理器和INDIRECT函数的组合,以及WPS的特色功能,帮助用户高效准确地录入四级行政区划信息,提升数据录入效率并减少错误。

s1t2u3的博客 608

子进程关闭从父进程继承来的文件描述符

前一阵子遇到了这么一个问题,父进程创建了子进程,然后父进程退出。 子进程第一件事卸载sdcard,结果提示设备资源忙。在子进程中使用fuser命令查 看sdcard挂载目录,结果发现子进程的确占用了该目录, 马上就明白了是子进程继承了父 进程的文件描述符。同时我联想到一些开发不严谨的程序也经常出现忘记关闭文件 描述符的问题。子进程如何关闭父进程的文件描述符呢?这里提供两种方法供参考: 方

yuanbinquan的专栏 7039

实战演练:用wvp-GB28181-pro + ZLMediaKit搭建一个可用的国标视频监控测试环境(附设备模拟器对接)

本文详细介绍了如何使用wvp-GB28181-pro和ZLMediaKit在Ubuntu系统上搭建GB28181视频监控测试环境。从环境准备、组件解析到核心服务部署与设备模拟器对接,提供完整的实战指南,帮助开发者快速构建可验证的监控系统。

weixin_42692935的博客 579

《UNIX IO---再谈文件描述符》

在C程序中,文件由文件指针或者文件描述符表示。ISO C的标准I/0库函数(fopen, fclose, fread, fwrite, fscanf, fprintf等)使用文件指针,UNIX的I/O函数(open, close, read, write, ioctl)使用文件描

xingg的C++世界 1129

在claude code中使用glm模型出现Unable to connect to Anthropic services的解决方案

本文主要介绍了在claude code中使用glm模型出现Unable to connect to Anthropic services的解决方案,希望能对使用claude code的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 13万+

UE5 GAS 学习笔记 1.2游戏标签

这一节对GameplayTag游戏标签进行详细的讲解。

CloudHuCoding 1926

UNIX IO---再谈文件描述符--解决了我对文件描述符的疑惑

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://keren.blog.51cto.com/720558/170822 本文出自 “淡泊明志,宁静致远” 博客,请务必保留此出处http://keren.blog.51cto.com/720558/170822 在学习socket编程以及多进程编程的时候就已经对文件描

yw8355507的专栏 497

YOLO数据集实现数据增强的方法(裁剪、平移 、旋转、改变亮度、加噪声等)

数据集样本太少怎么办?数据集优质图像不够怎么办?如何做到更好的数据预处理?一文带你学会数据增强,还可实现带标签的扩充。

路人贾的博客 4万+

Unix通用IO

Unix文件共享、文件读写通用IO,/dev/fd

Shall#的博客 909

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Linux/Unix五种IO模型

五种IO模型 在《Unix网络编程》一书中提到了五种IO模型,分别是:阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。也被称为Linux的五种网络IO模型。 由于服务器端一般都是使用的Linux操作系统,所以了解这几种io模型学习java网络io模型的基础。Java的IO模型与Unix的IO模型的对应关系(这个对应关系并不严格):java-BIO模型对应Unix阻塞IO, java-NIO对应IO多路复用,java-AIO对应异步IO。 ............

m0_45861545的博客 1823

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Unix】文件IO与标准IO

一、文件IO 大多数UNIX文件IO只需用到5个函数:open、read、write、lseek以及close。 这些函数经常被称为不带缓存的IO(unbuffered IO),不带缓存是指每个read和write都调用内核中的一个系统调用。 这些不带缓存的IO函数不是ANSI C的组成部分,但是是POSIX.1和XPG3的组成部分。 1、对于内核而言,所有打开文件都由文件描述符引

guansir的专栏 3832

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

unix之文件IO

主要总结一下unix中的read和write函数的使用和相关特性。1、read:从打开的文件中读取数据函数原型:#include ssize_t read( int filedes , void* buf , size_t nbytes );参数:filedes 文件描述符  buf 存储读取到的字节内容的缓冲区      nbytes 准备读取的字节数返回值:如果调用成功返回读取的字节数 ; 如果已到文件的结尾处则返回0 ; 发生错误   返回-1其实read在读取文件时,一般都是通过循环,不断读入缓冲区

如果这是你所爱的,要坚持,并踏实。 2723

Unix网络IO模型

Unix 网络IO模型 文章目录Unix 网络IO模型一、几个重要的概念1.1 文件描述符1.2 内核空间、用户空间、用户态、内核态二、Unix网络IO模型2.1 阻塞IO2.2 非阻塞IO2.3 IO多路复用2.4 信号驱动IO2.5 异步IO 一、几个重要的概念 在Unix网络IO模型中,有几个比较重要的概念:用户空间、内核空间、用户态、内核态、文件描述符。 1.1 文件描述符 文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。 1.2 内核空

hefrankeleyn的博客 609

UNIX的五种IO操作方式

概述UNIX的五种IO操作方式,阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO。关于IO多路复用,讲述了三种方案与差异:select、poll、epoll。

陈海龙的格物之路 779
上一篇: win7与Ubuntu双系统安装过程
下一篇: 函数调用过程中栈到底是怎么压入和弹出的?
happygogf
博客等级 码龄15年 18粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值