close_on_exec选项:FD_CLOEXEC(fcntl)、O_CLOEXEC(open) 和 EPOLL_CLOEXEC(epoll_createl)

2023-10-29

close_on_exec解决的问题类型:

我们经常会碰到一个进程需要fork出子进程的情况,而且子进程很可能会继续exec新的程序。这就不得不提到如何妥善处理好子进程中无用文件描述符的问题。


fork函数的使用本不是这里讨论的话题,但必须提一下的是:子进程以写时复制(COW,Copy-On-Write)方式获得父进程的数据空间、堆和栈副本,这其中也包括文件描述符。刚刚fork成功时,父子进程中相同的文件描述符指向系统文件表中的同一项(这也意味着他们共享同一文件偏移量)。

接着,一般子进程会调用exec执行另一个程序,此时会用全新的程序替换子进程的正文,数据,堆和栈等。此时保存文件描述符的变量当然也不存在了,导致无法关闭无用的文件描述符了。所以会fork子进程后在子进程中直接执行close关掉无用的文件描述符,然后再执行exec

但是在复杂系统中,有时我们fork子进程时已经不知道打开了多少个文件描述符(包括socket句柄等),这此时进行逐一清理确实有很大难度。我们期望的是能在fork子进程前打开某个文件句柄时就指定好:“这个句柄我在fork子进程后执行exec时就关闭”。其实时有这样的方法的:即所谓的 close-on-exec。

close-on-exec的实现只需要调用系统的fcntl就能实现,很简单几句代码就能实现:

 int fd=open("foo.txt",O_RDONLY);
 int flags = fcntl(fd, F_GETFD);
 flags |= FD_CLOEXEC;
 fcntl(fd, F_SETFD, flags);

这样,当fork子进程后,仍然可以使用fd。但执行exec后系统就会字段关闭子进程中的fd了。


open()函数的flags参数可以传入O_CLOEXEC标记,man手册对其的描述如下: [ 注 意 : l i n u x 2.6.23 才 开 始 支 持 此 标 记 ] _{[注意:linux 2.6.23才开始支持此标记]} [linux2.6.23]
在这里插入图片描述
相近的还有epoll_fctl()函数当中的flags:EPOLL_CLOEXEC,使用fcntl()函数对文件描述符的close_on_exec属性进行设置的flags:FD_CLOEXEC(见上文示例代码);

这些宏的设定都是为了一步实现上面的提到的close-on-exec的效果。同时只要是和创建文件描述符或是对文件描述符的属性进行修改的函数的flags标志位一般都会保留实现close-on-exec的相关宏,只是前缀名不同,但是都以CLOEXEC结尾。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

close_on_exec选项:FD_CLOEXEC(fcntl)、O_CLOEXEC(open) 和 EPOLL_CLOEXEC(epoll_createl) 的相关文章

  • netty使用epoll报错:java.lang.UnsatisfiedLinkError: failed to load the required native library

    Caused by java lang UnsatisfiedLinkError could not load a native library netty transport native epoll x86 64 最近修改moquett
  • linux系统编程(七)进程

    文章目录 1 进程 1 1 进程相关概念 1 1 1 程序和进程 1 1 2 并发 1 1 3 单道程序设计 1 1 4 多道程序设计 1 1 5 CPU和MMU 1 1 6 进程控制块PCB 1 1 7 进程状态 1 2 环境变量 1 2
  • Linux-epoll机制

    主要接口 epoll create epoll ctl epoll wait epoll create 头文件 include
  • BIO/NIO/AIO

    IO模型 BIO BIO全称为 Blocking I O 是一种同步阻塞IO 最开始的网络通信就是BIO模型 服务端创建一个ServerSocket 客户端创建一个 Socket 去连接服务端 这样客户端与服务端便可以进行通信了 产生的问题
  • Epoll事件ET和LT模型分析

    1 Epoll事件有两种模型 ET 边沿触发 缓冲区状态发生变化时 触发一次 LT 水平触发 有数据可读 读事件一直触发 有空间可写 写事件一直触发 使用时 不指定事件模型 则默认是水平触发 2 ET模型 ET边缘触发模型 涉及以下问题 1
  • Nginx构建反向代理缓存服务器

    防伪码 曾经沧海难为水 除却巫山不是云 代理服务可简单的分为正向代理和反向代理 正向代理 用于代理内部网络对Internet的连接请求 如 NAT 客户端指定代理服务器 并将本来要直接发送给目标Web服务器的HTTP请求先发送到代理服务器上
  • select,poll,epoll优缺点及比较

    在之前我已经分析了这三个函数 请看我之前的文章 IO多路复用之select函数详解 IO多路复用之poll函数详解 IO多路复用之epoll函数详解 这篇文章只总结优缺点 以便面试时回答 select优点 1 select 的可移植性更好
  • JS逆向:Webpack打包后的代码怎么搞?猿人学爬虫比赛第十六题详细题解

    实战地址 http match yuanrenxue com match 16 抓包分析 地址栏输入 地址 按下F12并回车 发现数据在这里 查看cookie 无加密相关的字段 请求的接口倒是有个m的加密参数 看来这题的主要目的就是 看看m
  • 网络编程之IO复用机制(多路IO转接)之epoll_create,epoll_ctl,epoll_wait函数06

    1 epoll create函数 epoll create是创建一个epoll句柄 参数size用来告诉内核监听的文件描述符的个数 跟内存大小有关 include
  • Libevent库的介绍与应用

    Libevent库 Libevent概述 Libevent使用模型 Libevent库使用示例 Libevent事件类型和框架结构 使用Libevent完成tcp服务端 Libevent概述 Libevent是开源社区的一款高性能的I O框
  • Linux中select poll和epoll的区别

    原文地址 http www cnblogs com bigwangdi p 3182958 html 在Linux Socket服务器短编程时 为了处理大量客户的连接请求 需要使用非阻塞I O和复用 select poll和epoll是Li
  • linux系统编程(五)针对linux系统中文件的IO操作

    文章目录 1 系统调用 2 C标准库文件IO函数 3 open close函数 3 1 函数原型 3 2 常用参数 3 3 open常见错误 4 文件描述符 4 1 PCB进程控制块 4 2 文件描述图表 4 3 最大打开文件数 4 4 F
  • 关于epoll的IO模型是同步异步的一次纠结过程

    这篇文章的结论就是epoll属于同步非阻塞模型 这个东西貌似目前还是有争议 在新的2 6内核之后 epoll应该属于异步io的范围了 golang的高并发特性就是底层封装了epoll模型的函数 但也有文章指出epoll属于 伪AIO 真正的
  • 网络编程——epoll

    参考 TCP IP网络编程 尹圣雨 epoll epoll也是Linux下实现I O复用的一种方法 其性能优于select 基于select的I O复用服务器的设计缺陷 调用select函数后 针对所有文件描述符的循环语句 调用select
  • 如何构建netty-transport-native-epoll-4.0.32.Final-linux-x86_64.jar?

    我在 netty 中使用本机 epoll 传输 并且能够从存储库下载 netty transport native epoll 4 0 32 jar 不过我还需要 netty transport native epoll 4 0 32 Fi
  • 边缘触发的 epoll 和 oneshot 只报告一次

    我目前正在添加从创建的 sockfdsaccept到具有以下事件的 epoll 实例 const int EVENTS EPOLLET EPOLLIN EPOLLRDHUP EPOLLONESHOT EPOLLERR EPOLLHUP 一旦
  • epoll_wait 由于 EINTR 失败,如何解决?

    我的 epoll wait 由于 EINTR 失败 我的 gdb 跟踪显示了这一点 enter code here 221 in nptl sysdeps pthread createthread c gdb 224 in nptl sys
  • poll() 超时为 0 时会做什么?

    我正在看poll man page http man7 org linux man pages man2 poll 2 html 它告诉我的行为poll 当超时参数传入正值和负值时 它没有告诉我如果超时会发生什么0 有任何想法吗 看着epo
  • Linux 上的 Boost Asio 不使用 Epoll

    我的印象是 boost asio 默认情况下会使用 epoll 设置而不是 select 实现 但在运行一些测试后 看起来我的设置正在使用 select 操作系统 RHEL 4内核 2 6海湾合作委员会 3 4 6 我编写了一个小测试程序来
  • 如何将 boost::asio 与 Linux GPIO 结合使用

    我有一个单线程 Linux 应用程序 使用 boost asio 进行异步输入 输出 现在我需要扩展此应用程序以读取 GPIO 输入 sys class gpio gpioXX value 可以在边沿触发的 GPIO 输入上使用 boost

随机推荐

  • 赋值语句作为if的判断条件

    具体如下代码所示 char name xiaopingguo if char p NULL cout lt lt NULL lt
  • mysql按照每个表一个备份文件的逻辑备份脚本和检查报警脚本

    下面是逻辑备份脚本 1 首先通过information schema tables获取所有数据库名称 2 然后根据日期创建临时备份目录 根据数据库名进行循环 获取每个数据库下面的表名集合 3 然后进行循环备份 按照表级备份完成后 4 然后进
  • Microsemi Libero系列教程(一)——Libero开发环境介绍、下载、安装与注册

    文章目录 前言 Libero 简介 关于Libero IDE和Libero SoC Libero SoC Libero 下载 支持的操作系统 所有版本的安装包下载链接 V11 8安装包下载 V11 8 SP2补丁包下载 Libero 安装
  • java的示例题1

    前言 整理一部分java的示例题型 在线编译 入口 java的System out println与System out print 浩星 CSDN博客前言 java基础知识之System out println System out pr
  • vue配置history路由(Nginx版)

    修改Nginx配置文件 在里面加上这两段 h5为vue项目打包文件名 location h5 try files uri uri router index index html index htm location router rewri
  • css页眉标签,css与页眉,页脚和多栏布局scrled

    我正在尝试创建一个网页布局模板我的目标是页眉 页脚和2列之间 2栏是什么都给我最大的头痛 我想左列为固定宽度 右侧列填充剩余区域 我也成功完成了这一项 但我也希望这两列 垂直填充雨区 当内容填充超过我看每列要分别骂而不使用正常的Brower
  • 龙架构(LoongArch)赋能众享链网,相关产品已完成适配

    立足于中国特色区块链发展现状 以及 低成本 高效率 多兼容 新型网络技术发展需求 近日 龙芯3C5000L与众享链网底层平台 ChainSQL完成了兼容适配 龙芯3C5000L服务器作为超级节点正式加入众享链网并对外提供服务 适配结果表明
  • 【计算机视觉】MoCo 讲解

    有任何的书写错误 排版错误 概念错误等 希望大家包含指正 MoCo 模型概述 MoCo 是何恺明提出的一种通过对比学习的方式无监督地对图像编码器进行预训练的方法 MoCo 包括三个结构 query 编码器 key 编码器和动态字典 训练完成
  • Ubuntu20.4安装gnuradio艰辛之路

    自从毕设选了跟老师做雷达信号 一路坎坷 做信号盲检测需要安装gnuradio 一路艰辛 小白零基础经历耗费了差不多四天 经历了很多次系统奔溃死机 光是Ubuntu系统就重装了不下十次 最后打王者等待的时候 水晶爆了 但是突然弹出来安装好gn
  • Docker 具名和匿名挂载

    匿名挂载 v 容器内路径 docker run d p 9090 80 name nginx01 v etc nginx nginx 查看所有卷 volume 情况 docker volume ls DRIVER VOLUME NAME l
  • 使用Canvas扩展绘制动态ASP.NET Core Blazor气泡图

    目录 介绍 背景 使用代码 步骤1 创建ASP NET Core Blazor服务器应用程序 运行测试应用程序 步骤2 安装软件包 步骤3 创建模型类 创建服务类 步骤4 将服务添加到Startup cs中 步骤5 使用客户端项目 添加Ra
  • npm参数解释

    npm i i代表install 即安装模块选项 npm y y是yes的缩写 即npm后面需要手动配置的选项采用默认配置 npm S 将安装的模块放到dependency下 安装的模块在生产版本也会用到 如element ui等插件 生产
  • hadoop实践(六)eclipse 打包和liunx下运行

    在eclipse环境下开发的代码 可以打包并放入到linux环境的 hadoop 下运行 第一步 打包 前提是已经安装了打包工具 fatjar 首先eclipse右上角 从map reduce 切换到java 点击工程 右键会出现fat j
  • evplayer2可以多设备登录吗_EVPlayer2

    这是一个可以播放任何格式的全功能影音播放器 EVPlayer2适应于iPhone iPod ipad 可以通过iTunes或者WiFi传输文件到播放器内 也可以通过内置的下载客户端直接从Ftp Samba UPnP等服务器中打开影音文件 或
  • 微信小程序新手留言板

    微信小程序入简单留言板 首先在home wxml页面完成简单的布局
  • 从0开始的leetCode:Median of Two Sorted Arrays

    我的解法 很常规的解法 但是明显不符合题目要求的O logmn 的复杂度 public double findMedianSortedArrays int nums1 int nums2 int i 0 j 0 k 0 int length
  • 解决使用Rattle进行数据挖掘时的RGtk2包无法安装问题

    1 首先出现以下问题是由于RGtk2包已经下架 也并不是没有办法安装 2 打开如下官网 Togaware Rattle A Graphical User Interface for Data Mining using R 不同的操作系统选择
  • ubuntu20..04 安装ros noetic版本

    官方安装教程连接 noetic Installation Ubuntu ROS Wiki 一 设置软件源 1 进入 软件和更新 选择 Ubuntu软件 2 如上图所是 勾选前四个选项 下载自 位置选择合适的镜像地址 我选的是阿里云的 二 安
  • 基于C#语言MVC框架Aspose.Cells控件导出Excel表数据

    控件bin文件下载地址 https download csdn net download u012949335 10610726 ViewBag Title xx
  • close_on_exec选项:FD_CLOEXEC(fcntl)、O_CLOEXEC(open) 和 EPOLL_CLOEXEC(epoll_createl)

    close on exec解决的问题类型 我们经常会碰到一个进程需要fork出子进程的情况 而且子进程很可能会继续exec新的程序 这就不得不提到如何妥善处理好子进程中无用文件描述符的问题 fork函数的使用本不是这里讨论的话题 但必须提一