linux exec函数执行之前设置当前进程所有描述符FD_CLOEXEC

Linux进程执行机制与exec函数族深度解析 进程管理是操作系统核心功能之一,Linux通过fork-exec机制实现进程的动态切换。exec函数族作为关键系统调用,允许进程在不创建新进程的情况下完全替换当前执行镜像,这种设计既节省资源又确保隔离性。从技术实现看,涉及权限验证、内存清理、资源继承等底层操作,特别要注意文件描述符泄漏等常见问题。在服务器监控、Shell命令执行、守护进程启动等场景中,exec配合fork能构建灵活的进程管理体系。通过设置FD_CLOEXEC标志、控制环境变量等安全实践,可有效防范权限提升和参数注入风险。对于高频执行场景,采 阅读详情

1、查看进程打开的描述符

ll /proc/$PID/fd

在这里插入图片描述

2、C语言获取当前进程打开的fd并设置FD_CLOEXEC

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <dirent.h>
#include<stdint.h>


/* 将当前进程打开的所有描述符标志设置为CLOEXEC */
static void SetFDFlagToCLOEXEC(char* fd_path)
{
    if(!fd_path)
        return;
    //fcntl(fd,F_SETFD,FD_CLOEXEC); /* 设置exec时关闭 */
    
    DIR *dir;
    struct dirent *ptr;
    if ((dir = opendir(fd_path)) == NULL)
    {
        perror("Open dir error...");
        cout << " opendir error " << strerror(errno);
        return;
    }

    int fd = 0;
    while ((ptr = readdir(dir)) != NULL)
    {
        if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0)
            continue;
        
        fd = atoi(ptr->d_name);
        //if(fd == 0 || fd == 1 || fd == 2)
        //{
        //    continue;
        //}
        
        if(ptr->d_type == 8)    ///file
        {
            cout << " FD is " << ptr->d_name;
            fcntl(fd, F_SETFD, FD_CLOEXEC);
        }
        else if(ptr->d_type == 10)    ///link file
        {
            LOG_DEBUG << " FD is " << ptr->d_name;
            int ret = 0;
            //int ret = fcntl(fd, F_GETFD, 0);
            //cout << " ret&FD_CLOEXEC " << (ret&FD_CLOEXEC);
            
            fcntl(fd, F_SETFD, FD_CLOEXEC);
            ret = fcntl(fd, F_GETFD, 0);
            if(ret&FD_CLOEXEC)
            {
                cout << "exec运行 时该描述符关闭";
            }
        }
        else if(ptr->d_type == 4)    ///dir
        {
           
        }
    }
    
    closedir(dir);
    
}

int main()
{
	pid_t pid = getpid();
    char fd_path[64];
    memset(fd_path, 0, 64);
    snprintf(fd_path, 64, "/proc/%d/fd", pid);
    
    if (access(fd_path, 0) == -1)
    {
       /* 文件夹不存在 */
    }
    else
    {
        SetFDFlagToCLOEXEC(fd_path);
    }
    
    execv("demo", NULL);
}

3、参考

《1》、linux 根据进程号查看进程打开的所有文件描述符

linux系统编程之进程:exec系列函数使用 例如:在shell命令行执行ps命令,实际上是shell进程调用fork复制一个新的子进程,在利用exec系统调用将新产生的子进程完全替换成ps进程。当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行。用exec函数可以把当前进程替换为一个新进程,且新进程与原进程有相同的PID。1,带l 的exec函数:execl,execlp,execle,表示后边的参数以可变参数的形式给出且都以一个空指针结束。它由shell进程传递给当前进程,再由当前进程传递给替换的新进程。 阅读详情

相关推荐

软件考古学: O_CLOEXEC/FD_CLOEXEC

文章目录概述引入扩展--用法在系统调用中的使用深层次的原因 概述 O_* O代表什么意思?open flag。打开标志位。O_CLOEXEC 这个意思是打开的一个标志位,在执行exec时,在新fork的程序里需要关闭此fd。 引入 https://github.com/torvalds/linux/commit/f23513e8d96cf5e6cf8d2ff0cb5dd6bbc33995e4 上面这个commit 引入了这个标志位;为了处理一个问题:在多线程的程序(更精确的说法,所有使用了带有CLONE_F

mzhan017的博客 1416

FD_CLOEXEC 详解

最近在看《UNIX环境高级编程》这本书 在看第三章有关文件描述符号的时候有些地方不懂,就是题目的FD_CLOEXEC标志,上网查了一些资料,这里写个博客记录下。 一般来说进程往往会调用fork函数来执行一个子进程,调用execve()执行其他程序,这时候可能就导致子进程中存在一些无用的文件描述符问题。 父进程在fork函数的时候,子进程会拷贝跟父进程一样的地址空间,包括寄存器,文件描述符...

bemf168的博客 1万+

【Boost5】Boost变换器的输入电容

节点的电流有3个,一个是来自电源输入的,由于我们把Vin看成理想电源以及线路的电感的存在,它可以近似看作是恒定的电流源Iin,一个是流向输入电容Cin的电流Icin,另外一个节点是电感L电流IL。电容电流波形在整个开关周期内的平均值为0,充电和放电在一个周期中各占1/2,在图中充电部分面积和放电部分面积相等,那么在充电或放电的电荷量Q=I*t,从图中可以看出,在一个周期内电容电流变化量是ΔIL,那在电容在充电1/2T周期中电流的变化量是1/2ΔIL。输入电容上的ESR也会随着电流变化,影响输入电压的变化。

qq_43416206的博客 3347

设置文件描述符:FD_CLOEXEC(MAC OSX/LINUX)

当一个文件描述符被设置为FD_CLOEXEC标志时,这个文件描述符会在执行exec调用时自动关闭,这样可以防止在新程序中意外地继承和使用这些文件描述符。对于子进程,当父进程设置文件描述符的FD_CLOEXEC标志后,这些文件描述符在子进程中会继承该标志。这意味着,如果一个文件描述符在父进程中被设置了FD_CLOEXEC标志,在执行fork创建子进程时,子进程将会继承这个标志。因此,如果父进程在执行exec调用之前设置了FD_CLOEXEC标志,那么在子进程中这些文件描述符也会在执行exec调用时自动关闭。

liulilittle的博客 1585

详解Nacos集群搭建

在我们日常的开发当中,用的都是单点Nacos,这种模式,我们自己开发测试玩一玩还可以,但是到了企业的生产环境之下,你还这么玩的话,那肯定是要出大问题了。因为在企业当中,我们更加强调的是高可用,所以在企业的生产环境下,Nacos一定要做成个集群。

博客 1万+

【gateway nc adapter虚拟网卡 win11 联想】问题的解决

由于需要登录公司内网,于是启用奇安信VPN。但启动后报出网关未连接的问题,于是我检查了我的网络适配器,并尝试解决,以下给出几种我实践过程中的行动,并附带最后成功的解决方法。

m0_73602417的博客 6546

FD_CLOEXEC用法及原因_转

我们经常使用fork()函数来创建子进程,而子进程也会exec其他的应用程序,在linux系统下,子进程以写时复制(Copy On Write)获得父进程的数据空间,栈和栈副本,其中就包括父进程所使用的文件描述符,刚fork()成功的时候,父进程与子进程相同的文件描述符指向系统文件表中的同一项(他们共享同一文件偏移量)。 子进程接下来会exec另一个程序,此时全新的程序会替换子进程的正文、数据、堆和栈等,此时保存的文件描述符自然不存在了,我们也不能关闭无用的文件描述符,所以我们通常在fork()子进程后关

u012460738的博客 1534

Windows加域迁移避坑指南:Profwiz工具实战中的5个常见问题与解决方案

本文详细解析了使用Profwiz工具进行Windows加域迁移时的5个常见问题及解决方案,包括临时配置文件生成、密码策略冲突、SID冲突等。通过实战案例和优化技巧,帮助IT运维团队高效完成账户配置文件迁移,确保Active Directory环境下的数据完整性和权限无缝衔接。

q9r0s的博客 515

Linux基础 -- FD_CLOEXEC 的作用与使用及注意事项

是文件描述符的一个标志,决定了文件描述符是否会在执行新程序时关闭。系列函数时,文件描述符会自动关闭,避免在新程序中被意外使用。避免资源(如文件、套接字)被意外继承到子进程中,提升安全性。确保文件描述符只在需要的进程中存在,防止无用资源占用。后新程序崩溃,可能是由于继承了不必要的文件描述符。守护进程通常需要关闭所有不必要的文件描述符,可结合。后立即关闭文件描述符,而不是等到。,这些文件描述符会保持打开状态。后会被子进程继承,而在执行。创建套接字时,同样推荐使用。系列函数时,如果未设置。创建管道时,可以设置。

sz66cm 学习随笔 1371

MATLAB演示元胞自动机算法

一、元胞自动机理论 元胞自动机与格子理论是一个非常好的模型,许多复杂的问题都可以通过它来建立模型,下面就简要介绍一下。 元胞自动机 实质上是定义在一个具有离散、有限状态的元胞组成的元胞空间上,并按照一定的局部规则,在离散的时间维度上演化的动力学系统。 元胞 元胞又可称为单元、细胞,是元胞自动机的最基本的组成部分。 元胞具有以下特点: 元胞自动机最基本的单元。 元胞有记忆贮存状态的功...

frange zone 2万+

【城市数据集】世界城市数据库和访问门户工具WUDAPT

简介世界城市数据库和访问门户工具WUDAPT

WW、forever的博客 1284

Linux fcntl中FD_CLOEXEC 作用

文章目录一、FD_CLOEXEC 说明二、实例2.1 当启动CLOSEXEC时2.2 当关闭CLOSEXEC时 一、FD_CLOEXEC 说明 FD_CLOSEXEC是文件描述符的标志位之一(标志位现在只有这一个)。 意思是,标志当前文件描述符,在执行exec时(exec指定的程序执行之前),是否关闭该文件描述符。 二、实例 因为要用到exec这里,我们就写两个程序。并且由于子程序的标准输出,不连接到terminal。所以我们把内容打印到文件中。 // fcntl.c主程序代码 #include <f

HotIce0 2918

基于STM32、HAL库的AD7124-8BCPZ模数转换器ADC驱动程序设计

/ 配置0: 使用内部参考电压(2.5V),增益128,双极性。// 配置通道0: AIN0+和AIN1-,使用配置0和滤波器0。// 100ms采样间隔。// 转换为电压值(使用内部2.5V参考电压)// 构造读命令: 最高位为1表示读,接下来7位是寄存器地址。// 构造写命令: 最高位为0表示写,接下来7位是寄存器地址。// 配置滤波器0: 输出数据率50Hz,后置滤波器4。

corlin6688的博客 528

Linux 文件描述符标记之 FD_CLOEXEC

重读The method to epoll’s madness 之前转载的这篇博客,里边提到的文件描述符标记和文件描述状态: 当前的Linux 支持的文件描述符标记只有 FD_CLOEXEC,可通过 fcntl 指定宏 F_SETFD 和 F_GETFD 来设置和读取文件描述符标记,参看 GUN 文件描述符标记文档。 系统调用 open 可以指定 O_CLOEXEC 来置位文件描述...

zhouguoqionghai的博客 2437

「HTML和CSS入门指南」hr 标签详解

标签是 HTML5 中用于插入水平分割线的标签,常用于在页面中添加分隔线或者段落之间的分割线。通过灵活运用 标签和属性,我们可以帮助用户更好地理解页面内容,同时也可以美化和装饰页面。在实际应用中需要注意避免过度使用 标签,以使页面看起来简洁明了。

a451319296的博客 7661

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

open函数O_CLOEXEC模式和fcntl函数FD_CLOEXEC选项

open函数O_CLOEXEC模式和fcntl函数FD_CLOEXEC选项 文章目录open函数O_CLOEXEC模式和fcntl函数FD_CLOEXEC选项1. open函数O_CLOEXEC模式2. fcntl函数FD_CLOEXEC选项3. 演示程序 1. open函数O_CLOEXEC模式 #include <sys/types.h> #include <sys/st...

Erice_s的博客 2593

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

关于fd的close on exec(非常重要)

子进程socket继承问题 发表于10 九月, 2013由zhoutall 昨天实习的时候遇到这样一个问题,抽象起来如下: 有一个进程A,它是一个全局监控进程,监控进程B。 进程B是一个局部监控进程,监控C,C是由B fork出来的子进程。 C向B汇报,B向A汇报。 因为进程A和其他进程在不同机器上,所以所有的操作都是通过json rpc的远程调用执行的。 假设B监听1111

harvey.loo的专栏 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

linux 关闭 fd 脚本,关于fcntl(fd, F_SETFD, FD_CLOEXEC)设置exec时close的属性

关于fcntl(fd, F_SETFD, FD_CLOEXEC)设置exec时close的属性snd_ctl_hw_open#define SNDRV_FILE_CONTROL ALSA_DEVICE_DIRECTORY "controlC%i"sprintf(filename, SNDRV_FILE_CONTROL, card); // 路径/dev/snd/controlC0fd = s...

weixin_42373103的博客 1322

使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符

原文地址:http://blog.youkuaiyun.com/chrisniu1984/article/details/7050663   我们经常会碰到需要fork子进程的情况,而且子进程很可能会继续exec新的程序。这就不得不提到子进程中无用文件描述符的问题! fork函数的使用本不是这里讨论的话题,但必须提一下的是:子进程以写时复制(COW,Copy-On-Write)方式获得父进程的数

雜貨鋪 1669

Linux O_CLOEXEC

特别是在使用execle启动新程序时,使用O_CLOEXEC标志尤其重要,因为它可以保证在子进程启动时,文件描述符不会被占用。是一个在打开文件时设置的标志,它告诉操作系统,当调用exec函数时,该文件描述符应该被关闭,这个标志的作用是避免文件描述符被继承到子进程中。所以,当子进程关闭一个文件描述符时,它只是关闭了自己的那一份副本,而不会影响到父进程的文件描述符。至于你的第二个问题,如果子进程继承了父进程的文件描述符,那么当子进程退出时,它会关闭所有打开的文件描述符。系列函数时,该文件描述符会被自动关闭。

我的博客 1943

linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用

本节目标: exec替换进程映像 exec关联函数组(execl、execlp、execle、execv、execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种操作进行管理。 当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行。...

diehuojiang5959的博客 4889

fcntl设置FD_CLOEXEC标志作用【转】

本文转载自:https://blog.youkuaiyun.com/ustc_dylan/article/details/6930189 通过fcntl设置FD_CLOEXEC标志有什么用?close on exec, not on-fork, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行的程序里,此描述符被关闭,不能再使用它,但是在使用fork调用的子进程中,此描述符并不关闭,仍可使用。...

zzb2760715357的博客 134

【exp】open中的 O_CLOEXEC 标志 (Linux C语言)

当我们用execve执行其他程序的时候,全新的程序会替换子进程中的地址空间,数据段,堆栈,此时保存与父进程文件描述符也就不存在了,也无法进行关闭,这时候就需要FD_CLOEXEC, 表示子进程在执行exec的时候,该文件描述符就需要进行关闭。父进程在fork函数的时候,子进程会拷贝跟父进程一样的地址空间,包括寄存器,文件描述符,堆,栈等。中,一个线程将要设置O_CLOEXEC标志时,虽一个线程fork(),且先得到执行,导致打开的文件描述符泄露到子进程中。

dc3120的专栏 2604

文件描述符中设置FD_CLOEXEC的用处

linux中,父进程fork出子进程,子进程本身会继承父进程的所有文件描述符。若子进程再调用exec系列函数转化为新的进程实体,其实父进程的描述符对其没有意义。此时文件上只需要设置FD_CLOEXEC即可。注意,如果fork进程后,没有调用exec,则无论FD_CLOEXEC是否设置,子进程一定会继承父进程的全部文件描述符。再运行看看情况,如下所示,产生的两个进程号分别是64187,64188,可以看到文件描述符被子进程继承了。然后查看进程的fd信息,可以看到my.txt这个文件描述符没有继承下去。

tusong86的博客 507

关于linux进程间的close-on-exec机制

转载自:http://blog.youkuaiyun.com/ljxfblog/article/details/41680115 通过fcntl设置FD_CLOEXEC标志有什么用?    close on exec, not on-fork, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行的程序里,此描述符被关闭,不能再使用它,但是在使用fork调用的子进程中,此描述符并

sunny_ss12的专栏 803
上一篇: linux mount函数nfs挂载
下一篇: ONVIF获取265的rtsp地址,ptz控制记录
王log
博客等级 码龄12年 1806粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值