fork()子进程与父进程之间的文件描述符问题

linux 子程序文件描述符继承问题 在客户端A操作重启客户端B之后,你会发现,再也无法正确和子进程建立正确的网络连接,而各个子进程的例如心跳包、连接是正常的,不会触发连接状态变化或者网络重连。最近在工作中遇到了一个设计,软件即做服务器,又做客户端,做客户端时跟另外一个服务器建立连接,做服务器时,是与自己启动的几个子进程程序建立连接。而system启动起来的子程序会继承父进程的所有文件描述符,包括套接字,故出现了意想不到的bug。我的应用场景如上图,客户端A的命令通过服务端A的处理之后转发给客户端B,客户端B响应命令开启子进程。 阅读详情
不错的文章,收藏,以备查阅: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个表的关系原理图如下:
fork()子进程与父进程之间的文件描述符问题 - HH - 计算机
系统文件表包含一个偏移量,给出了文件当前的位置。若2个进程同时打开一个文件(如上图A,B)做读操作,每个进程都有自己相对于文件的偏移量,而且读入 整个文件是独立于另一个进程的;如果2个进程打开同一个文件做写操作,写操作是相互独立的,每个进程都可以重写另一个进程写入的内容。
如果上面进程在open以后又执行了close()函数,操作系统会删除文件描述符表的第四个条目和系统文件表的对应条目(若指向它的描述符表唯一), 并对内存索引节点表条目中的计数减1,如果自减以后变为0,说明没有其他进程链接此文件,将索引节点表条目也删除,而这里进程B也在open这个文件,所 以索引节点表条目保留。 

2、文件描述符的继承
通过fork()创建子进程时,子进程继承父进程环境和上下文的大部分内容的拷贝,其中就包括文件描述符表。
(1)对于父进程在fork()之前打开的文件来说,子进程都会继承,与父进程共享相同的文件偏移量。如下图所示(0-1-2 表示 标准输入-输出-错误):
fork()子进程与父进程之间的文件描述符问题 - HH - 计算机
系统文件表位于系统空间中,不会被fork()复制,但是系统文件表中的条目会保存指向它的文件描述符表的计数,fork()时需要对这个计数进行维护, 以体现子进程对应的新的文件描述符表也指向它。程序关闭文件时,也是将系统文件表条目内部的计数减一,当计数值减为0时,才将其删除。
(2)相反,如果父进程先进程fork,再打开my.dat,这时父子进程关于my.dat 的文件描述符表指向不同的系统文件表条目,也不再共享文件偏移量(fork以后2个进程分别open,在系统文件表中创建2个条目);但是关于标准输入, 标准输出,标准错误,父子进程还是共享的。
fork()子进程与父进程之间的文件描述符问题 - HH - 计算机
 
 
 原文地址:http://keren.blog.51cto.com/720558/170822
python中fork()函数生成子进程分析 python的os module中有fork()函数用于生成子进程,生成的子进程是父进程的镜像,但是它们有各自的地址空间,子进程复制一份父进程内存给自己,两个进程之间的执行是相互独立的,其执行顺序可以是不确定的、随机的、不可预测的,这点与多线程的执行顺序相似。   import os def child(): print 'A new child:', os.getpid() p 阅读详情

相关推荐

从SGX到TDX:英特尔机密计算的技术演进与选型指南

本文深入解析了英特尔两代机密计算技术SGX与TDX的核心差异与选型策略。SGX提供应用级飞地隔离,安全等级高但开发复杂;TDX提供虚拟机级信任域保护,兼容性好且易于部署。文章结合金融与医疗行业实战案例,为开发者提供了清晰的选型指南,帮助根据代码可改性、安全需求、部署规模及生态成本选择最合适的机密计算方案。

java5的博客 420

【Linux】文件描述符&先打开open文件再fork&先fork再open

首先,fork创建的子进程的pcb,然后,子进程把父进程的拷贝一份。子进程的file.txt就是拷贝父进程的,也就是他俩共享fork之前的文件描述符。总结:父进程的文件描述符fork以后,子进程也可以访问,而且父子进程共享文件偏移量。(父进程打开一个文件,fork之后的子进程也可以使用,父子进程共享) 补充:在这种情况下,共享偏移量,如果父子进程共同编写文件会出错,因此,父进程一般情况下把文件给子进程,子文件编写。

qq_53830608的博客 1198

从零构建物联网监控系统:STM32+迪文屏+WiFi模组的实战解析

本文详细解析了基于STM32微控制器、迪文串口屏和WiFi模组构建物联网监控系统的完整方案。从硬件选型、系统架构设计到数据交互实现,提供了包括迪文屏GUI开发、STM32通信协议、低功耗优化等实战经验,帮助开发者快速掌握物联网监控系统的核心技术。

docker7nomad的博客 730

【Linux】关于fork后exec子进程继承父进程文件描述符保持开放的问题

https://www.cnblogs.com/SebastianHan/p/12469915.html 在多进程编程中,根据业务需要会通过fork+exec执行shell脚本或其它程序,在fork后父、子进程对于每一个打开的文件描述符共享同一个文件表项,此时可能有多个文件描述符项指向同一文件表项。有时子进程不需要继承父进程的文件描述符,并且在exec后子进程继承下来的文件描述符成了耗费系统资源的一个累赘,此时应该怎么处理呢?接下来我将分享下我在工作中遇到的问题以及解决方案。 ...

m0_46535940的博客 1056

缺陷检测-金属表面缺陷检测

1介绍 缺陷检测是工业视觉技术中最重要的组成部分。业务广泛,场景丰富,技术难点高、工作量大。针对不同的场景,选择不同的相机和

huneng1991的专栏 5250

Win11大版本更新失败:系统保留分区空间不足的终极解决方案

本文针对Windows 11大版本更新时遇到的“系统保留分区空间不足”错误,提供了详细的诊断与解决方案。核心问题在于EFI系统分区(ESP)空间过小,导致更新失败。文章重点介绍了使用傲梅分区助手等第三方工具安全扩展EFI分区的完整步骤,并提供了手动清理、使用安装介质修复等替代方案,帮助用户彻底解决更新障碍,顺利完成Win11升级。

weixin_29280219的博客 955

父子进程间文件共享

fork函数调用一次,返回两次。在新创建的过程中返回一次,返回值为0.在原来的进程中返回一次,返回值是新进程的pid。 通过fork函数创建的进程为新进程的父进程。即就是,通过fork创建的进程与原进程是父子关系。孤儿进程:当父进程结束以后,子进程未结束,子进程的父进程变为init。init这个进程是守护进程,它负责处理这些孤儿进程退出以后的一些状态。 僵死进程:(1)父进程未结束,子进程结束,

静沐暖阳的博客 2450

【推荐100个unity插件之10】Unity Cinemachine最全的最详细的虚拟相机介绍,详细案例讲解,快速上手

相信很多同学都用过Unity的Cinemachine插件,使用它可以很方便地实现一些摄像机效果,比如摄像机追踪、推拉镜头、分镜等效果。Cinemachine的知识特别的多又很常用,本来是想做一期来讲一下的,结果搜索发现已经有人做过了,而且内容挺全的,但是内容可能比较啰嗦,还有部分没有补充,所以我就先转载下来,后续有时间再优化修改补充,觉得内容不错的,很欢迎大家去支持原作者。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2万+

fork()子进程与父进程之间的文件描述符问题 www.educity.cn/linux/1241859.html

在C程序中,文件由或者文件描述符表示。ISO C的标准I/0库函数(fopen, fclose, fread, fwrite, fscanf, fprintf等)使用文件指针,UNIX的I/O函数(open, close, read, write, ioctl)使用文件描述符。下面重点来说下,文件描述符是如何工作的。  文件描述符相当于一个逻辑句柄,而open,close等函数则是将文件或者物理设

诺尔曼 783

《YOLO多模态创新改进专栏目录 》全网独家创新,多模态融合改进教程,包含早期融合、中期融合、后期融合、损失函数改进、二次创新模块、独家创新等几百种创新点改进,答疑群提供完整项目,永久更新中

🔥《YOLO多模态创新改进专栏》重磅来袭!🚀 本专栏汇集最新顶会顶刊创新点,提供1000+篇YOLO多模态改进方案(涵盖v8-v26),包含: 多模态融合策略(早期/中期/后期) 损失函数优化 独家创新模块 详细改进步骤 ✨特色服务: ✔️ 配套完整可运行项目 ✔️ 专业答疑群支持(含非计算机专业指导) ✔️ 持续更新至2026年 ✔️ 适用目标检测/OBB/分割/分类等多任务 💡适合人群: 科研人员 | 研究生 | 需发SCI/CCF论文者 环境要求宽松,新手友好,助力快速产出科研成果! 📈早订优

Ai缝合怪、助力小伙伴高效发论文 748

【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)

在游戏发展史上,有些游戏以其简单而耐玩的特性,深深地烙印在了玩家的记忆中。《黄金矿工》就是其中之一,它曾经在4399等游戏平台上掀起了一股游戏热潮。这款游戏不仅给无数玩家带来了欢乐,还让他们体验到了挖掘金矿的刺激与乐趣。在这个项目中,我们将花费半天的时间,利用Unity引擎,重新打造这款经典小游戏。通过复刻《黄金矿工》,我们不仅是在向童年的回忆致敬,更是在挖掘游戏设计的精髓。在这个过程中,我们将学习如何实现游戏的核心玩法,设计简洁而有效的游戏机制。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2902

进程(二)—— fork()创建子进程

上一次说明了进程是怎么被创建的,进程的程序又是如何运行的,本文主要介绍fork()函数创建进程的过程中发生了什么,结合代码进行过程分析

challenglistic的博客 1万+

台球 PCOL:极致物理还原的网页斯诺克引擎(附源码深度解析)

*完整源码地址**:[https://github.com/billiards/pcol-core](https://github.com/billiards/pcol-core)(包含详细文档与示例)通过这个项目,我们不仅创建了一个游戏,更构建了一个**可扩展的物理引擎框架**,为网页端复杂物理模拟开辟了新的可能性。**在线体验**:[https://pcol.billiards](https://pcol.billiards)(支持移动端触控操作)clone.velocity.x *= -0.92;

Loving_enjoy的博客 2799

4.父进程和子进程

父进程和子进程                                子进程是父进程的复制品Unix/linux系统中的进程创建是这样的,理解起来有点绕。父进程先执行fork()系统调用,这个调用的结果是系统中多出了一个跟父进程内容完全一样的进程,这个新进程被称为子进程,当然该进程的PCB中父进程指针是指向第一个进程的。前后两个进程各自有自己的地址空间,形式上有点像把一个文件拷贝了一个副本...

郑学炜的技术博客 3万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

创建进程fork——父进程与子进程

fork创建进程 fork系统调用是用于创建进程的,并且fork创建的进程初始化状态与父进程一样。(进程空间中的变量)系统会为fork的进程分配新的资源 fork系统调用无参数。 fork返回两次,(在父进程中)第一次返回子进程id,(在子进程中)第二次返回0 .换句话说就是返回子进程id的是父进程,返回0的是子进程。 测试代码 ...

jane_6091的博客 7618

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

fork()子进程与父进程的关系(继承了什么)

之前发过一篇博客**fork函数详解** #include<stdio.h> #include<string.h> #include<stdlib.h> #include<unistd.h> void main() { char str[6]="hello"; pid_t pid=fork(); if(pid==0...

qq_22613757的博客 6744

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

fork调用后,子进程与父进程是否共享变量

回顾fork调用 fork系统调用从已存在的进程中生成一个新的进程,这个新的进程就是子进程,我们可以通过fork系统调用的返回值来区分子进程还是父进程。 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程。 我们的问题是,进程中的变量是否由父进程和子进程共享? 背景 最开始我简单的认为,似乎是看视频里说的。对于只读变量,父

浅浅的i的博客 1万+

fork出的子进程和父进程

一、fork后的父子进程 由fork创建的新进程被称为子进程(child process)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新进程(子进程)的进程 id。将子进程id返回给父进程的理由是:因为一个进程的子进程可以多于一个,没有一个函数使一个进程可以获得其所有子进程的进程id。对子进程来说,之所以fork返回0给它,是因为它随时可以调用getp...

西红柿爱炒番茄 5524

fork()函数创建子进程

APUE–fork()函数介绍 文章目录APUE--fork()函数介绍一、fork()系统调用介绍1.fork()创建子进程特点2. 子进程的特点二、代码示例1.fork()创建子线程2.子进程对内存修改 一、fork()系统调用介绍 1.fork()创建子进程特点 fork()用于创建子进程,一次调用会有两个返回(return),一次返回给父进程子进程的PID(Process ID),一次返回给子进程,其返回值为0. 返回值=0,子进程在运行 返回值>0,父进程在运行 返回值<0,fo

qq_47834139的博客 7224

在用fork创建子进程时,getppid()返回的却不是父进程的pid,或getppid()返回1。

在学习fork时,了解了子进程与父进程的概念,打算敲代码来实践认识一下。发现了一个很奇怪的问题,使用fork()之后,父进程中pid返回值是子进程,但是子进程中调用getppid(),得到的返回值却不是父进程。 我们先来复习下 fork(),getpid()和getppid()三个函数: 查看manual page: fork: pid_t fork(void); //creates a...

Oerror_的博客 3438

Linux 的父进程和子进程的执行情况(附有案例代码)

该文章主要是针对面试做大致的了解,通俗易懂!!!指已创建一个或多个子进程的进程。在Linux里,除了进程0以外的所有进程都是由其他进程使用系统调用fork()函数创建的,这里调用fork()函数创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程。指的是由另一进程(对应称之为父进程)所创建的进程。子进程继承了对应的父进程的大部分属性,如文件描述符。在Unix中,子进程通常为系统调用fork()函数的产物。在此情况下,子进程一开

热爱数据库的小胖 8509

fork()函数,fork()子进程父进程的比较总结,fork()与vfork()的比较总结

进程创建fork() fork()函数以父进程为蓝本复制一个进程,其ID号与父进程ID号不同,内存等与父进程不同,其他与父进程同享,只有在父进程或者子进程进行了修改后,才重新生成一份。 成功时,fork返回是进程ID,失败返回-1; #include<sys/types.h> #include<unistd.h> pid_t fork(void) for k()...

weixin_42904113的博客 990

fork之后子进程到底复制了父进程什么

作者:狂奔的乌龟 来源:优快云 原文:https://blog.youkuaiyun.com/xy010902100449/article/details/44851453 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<unistd.h> void main...

一直走,不要回头 2993

P10 Linux进程编程 fork创建子进程

🎬 个人主页:@ChenPi🐻推荐专栏1: 《》✨✨✨🔥 推荐专栏2: 《》✨✨✨🛸推荐专栏3: ​​​​​​《》 ✨✨✨🌺本篇简介 : 上一章我们讲了Linux进程的概念以及获取进程ID号和获取父进程的ID这一章我们引进新的概念,父子进程Linux 是一个多用户多任务的操作系统,每个用户可以同时运行多个程序进程是程序运行的主体,包括进程的创建,调度和消亡的整个过程当用户执行一个指令或者启动一个程序时,就创建了一个进程一个运行的程序也可能有多个进程。每个进程将被分配各种资源。

weixin_73901182的博客 1222

在父进程fork子进程的继承资源的弊端和解决方法

在父进程通过system()函数创建或fork创建子进程时,子进程会继承父进程的资源,包括文件设备访问权限、文件描述符等。这些资源在父子进程交互或共享提供便利的同时也带来了一些弊端,fork会导致 file->count++, 在父进程 close的这些文件设备时候发现还是别的地方对这些文件设备使用,就不会release,导致父进程重新open的时候就会出现"Cannot o...

chengf223的博客 2533
上一篇: struct timeval结构体 以及 gettimeofday()函数
下一篇: dup and dup2的剖析
行知2014
博客等级 码龄19年 8粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值