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

当Kmer遇到多倍体:复杂基因组Survey分析中的避坑指南 本文针对小麦、棉花等多倍体及高杂合复杂基因组的Survey分析,深入解析了Kmer分布图解读中的常见陷阱。文章重点探讨了如何超越理想二倍体模型,利用Smudgeplot等工具准确判断基因组倍性,并提供了从参数优化、污染判断到结果验证的全流程实战指南,帮助研究者规避错误,获得更准确的基因组大小、杂合度等关键信息。 阅读详情

关于open函数O_CLOEXEC模式,fcntl函数FD_CLOEXEC选项,总结为如下几点:

  1. 调用open函数O_CLOEXEC模式打开的文件描述符在执行exec调用新程序中关闭,且为原子操作。

  2. 调用open函数不使用O_CLOEXEC模式打开的文件描述符,然后调用fcntl 函数设置FD_CLOEXEC选项,效果和使用O_CLOEXEC选项open函数相同,但分别调用open、fcnt两个l函数,不是原子操作,多线程环境中存在竞态条件,故用open函数O_CLOEXEC选项代替之。

  3. 调用open函数O_CLOEXEC模式打开的文件描述符,或是使用fcntl设置FD_CLOEXEC选项,这二者得到(处理)的描述符在通过fork调用产生的子进程中均不被关闭。

  4. 调用dup族类函数得到的新文件描述符将清除O_CLOEXEC模式。

测试程序如下:

#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define err_sys(fmt, arg...) \
do { \
    printf(fmt, ##arg);\
    printf("\nerrno:%d %s\n", errno, strerror(errno));\
    exit(EXIT_FAILURE);\
} while (0)


int main()
{
    int fd, fd2, val;
    pid_t pid;
#ifdef _O_CLOEXEC
    if ((fd = open("my.txt", O_RDWR | O_CREAT | O_CLOEXEC, 0600)) < 0) 
#else
    if ((fd = open("my.txt", O_RDWR | O_CREAT, 0600)) < 0) 
#endif
        err_sys("open error");

#ifdef _DUP
    if ((fd2 = dup(fd)) < 0)
        err_sys("dup error");
    if (write(fd2, "123", 3) < 0)
        err_sys("write error");
#endif

#ifdef _FCNTL_CLOEXEC
    if ((val = fcntl(fd, F_GETFD)) < 0)
        err_sys("fcntl(F_GETFD) error");

    val |= FD_CLOEXEC;
    if (fcntl(fd, F_SETFD, val) < 0)
        err_sys("fcntl( F_SETFD) error");
#endif

#ifndef _FORK 
    if (execl("/bin/sleep", "sleep", "10000", (void*)0) < 0)
        err_sys("execl error");
#else
 switch ((pid = fork())) {
        case -1:
            err_sys("fork error");
        case 0:
            sleep(10000);
            break;
        default:
            sleep(10000);
            break;
    }
#endif

    return 0;
}

通过宏_O_CLOEXEC编译进O_CLOEXEC选项

#gcc -D_O_CLOEXEC -o cloexec cloexec.c

执行程序

#./cloexec 

查看进程和进程资源,注意执行execl后进程名字变为sleep了

#ps aux|grep sleep 
root      7900  0.0  0.0   4200   280 pts/0    S+   11:45   0:00 sleep 10000
root      7915  0.0  0.1   4384   836 pts/1    S+   11:49   0:00 grep --color=auto sleep

#lsof -p 7900     
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
sleep   7900 root  cwd    DIR    8,1     4096 163741 /home/zozy/AUP
sleep   7900 root  rtd    DIR    8,1     4096      2 /
sleep   7900 root  txt    REG    8,1    26156 131621 /bin/sleep
sleep   7900 root  mem    REG    8,1  2919792     12 /usr/lib/locale/locale-archive
sleep   7900 root  mem    REG    8,1  1730024  15701 /lib/i386-linux-gnu/libc-2.15.so
sleep   7900 root  mem    REG    8,1   134344  15713 /lib/i386-linux-gnu/ld-2.15.so
sleep   7900 root    0u   CHR  136,0      0t0      3 /dev/pts/0
sleep   7900 root    1u   CHR  136,0      0t0      3 /dev/pts/0
sleep   7900 root    2u   CHR  136,0      0t0      3 /dev/pts/0

可以看出进程资源中没有文件my.txt

不带宏_O_CLOEXEC编译

#gcc  -o nocloexec cloexec.c

执行程序

#./nocloexec 

查看进程和进程资源

#ps aux|grep sleep
root      7925  0.0  0.0   4200   280 pts/0    S+   11:51   0:00 sleep 10000
root      7928  0.0  0.1   4384   836 pts/1    S+   11:52   0:00 grep --color=auto sleep

#lsof -p 7925
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
sleep   7925 root  cwd    DIR    8,1     4096 163741 /home/zozy/AUP
sleep   7925 root  rtd    DIR    8,1     4096      2 /
sleep   7925 root  txt    REG    8,1    26156 131621 /bin/sleep
sleep   7925 root  mem    REG    8,1  2919792     12 /usr/lib/locale/locale-archive
sleep   7925 root  mem    REG    8,1  1730024  15701 /lib/i386-linux-gnu/libc-2.15.so
sleep   7925 root  mem    REG    8,1   134344  15713 /lib/i386-linux-gnu/ld-2.15.so
sleep   7925 root    0u   CHR  136,0      0t0      3 /dev/pts/0
sleep   7925 root    1u   CHR  136,0      0t0      3 /dev/pts/0
sleep   7925 root    2u   CHR  136,0      0t0      3 /dev/pts/0
sleep   7925 root    3u   REG    8,1        0 163759 /home/zozy/AUP/my.txt

可以看出进程资源中有文件my.txt

测试fcntl函数可以通过设置编译宏-D_FCNTL_CLOEXEC测试,编译测试过程同上,同理通过开启-D_O_CLOEXEC -D_FORK编译选项测试使用O_CLOEXEC模式的描述符在子进程中的状态,通过宏-D_DUP编译选项测试dup函数对O_CLOEXEC的影响,编译测试过程略。

AI自动化流程在金融风控中的3个典型案例 AI自动化风控流程全流程自动化:最小化人工干预,实现从数据输入到决策输出的闭环自适应学习:通过持续数据反馈实现模型自动迭代优化实时决策能力:满足毫秒级(支付风控)至分钟级(信贷审批)的响应需求多模态数据融合:整合结构化、非结构化和实时流数据智能决策解释:自动生成符合监管要求的决策解释人机协同机制:在高风险场景下实现AI与人类专家的协同决策实施后关键绩效指标(KPI)变化指标实施前实施后改进幅度平均审批时间3.2天4.7分钟-99.7%自动审批率15%85%+467% 阅读详情

相关推荐

【Qualcomm高通音频】如何封装音频控件?

音频代码涉及面很广,这篇文档介绍如何封装音频控件给HAL层使用。这里以AW87519芯片调试为例进行介绍封装音频控件和使用的方法。在最初接出到高通音频基础功能调试的时候,都是从tinyalsa指令/mixer_paths文件配置开始。因为单独一个音频设备的调试,都对应一条音频链路的打通。比如以下链接上高通平台基础音频输入输出设备调试: 【Qualcomm音频】Speaker 调试记录http...

crow_ch的博客 1954

fcntl.h头文件和unistd.h头文件

fcntl.h头文件和unistd.h头文件 转载地址:http://blog.sina.com.cn/s/blog_67eb1f2f0100m0sa.html fcntl.h定义了很多宏和open,fcntl函数原型 unistd.h定义了更多的函数原型   close(关闭文件) 表头文件#include 定义函数int close(int fd); 函数说明当使用完文

分享的滋味 2万+

CVE-2025-25249漏洞深度解析:FortiOS认证绕过与实战缓解

远程代码执行(RCE)是网络安全中最危险的漏洞类型之一,其核心往往源于认证机制失效或内存安全缺陷。CVE-2025-25249正属于此类高危漏洞——它不依赖用户凭证,也不需要交互触发,而是通过超长HTTP头(如X-Forwarded-For)引发内存越界写入,直接绕过FortiOS和FortiSwitchManager的完整认证流程。该漏洞影响广泛、CVSS评分高达9.8,凸显了嵌入式设备在HTTP协议栈实现中的深层风险。在企业网络中,FortiGate等设备常作为边界守门人,一旦失陷将导致root级控制权

weixin_33694620的博客 524

编译错误小记 - fcntl2.h

Normal 0 false false false MicrosoftInternetExplorer4 <!-- /* Font Definitions */ @font-face {font-family:宋体;

虚拟化开发 698

Pixhawk RPi CM4 Baseboard 树莓派CM4安装Ubuntu20.04 server 配置ros mavros mavsdk

cm4配置ros mavros连接pixhawk4 Pixhawk RPi CM4 Baseboard

baidu_41704597的博客 2127

JDK8升级JDK17过程中遇到的那些坑

JDK8虽然非常好,但是JDK版本已经发布到JDK20了,且JDK8后的版本升级了很多新的特性,如模块化、ZGC以及虚拟线程、结构性并发等,也是非常有吸引力的,所以决定将基于JDK8的项目升级到最近的LTS版本JDK17。

BASK2312的博客 6684

O_CLOEXEC模式和FD_CLOEXEC选项

O_CLOEXEC模式和FD_CLOEXEC选项 调用open函数O_CLOEXEC模式打开的文件描述符在执行exec调用新程序中关闭,且为原子操作。 调用open函数不使用O_CLOEXEC模式打开的文件描述符,然后调用fcntl 函数设置FD_CLOEXEC选项,效果和使用O_CLOEXEC选项open函数相同,但分别调用open、fcnt两个函数,不是原子操作,多线程环境中存在竞态条件,故用o

6912

暗月项目七详解

本文围绕“暗月靶场项目七”展开,记录了一次从外网 Web 入口逐步深入内网并最终获取域控目标的完整实训过程。

Re_K123的博客 416

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

一文搞懂 RC Correlation Scale Factor 的生成与应用

pre-route 用的是统计估算模型,post-route 用的是详细布线提取,signoff 用的是第三方 QRC 或 StarRC——三个工具,三套参数体系,结果自然天差地别。不同 RC corner(rc_worst/rc_best/rc_typical)对应不同的工艺角和温度环境,每个 corner 的 R/C 偏差比例不同,必须分别生成和应用各自的 scale factor。别被名字骗了,这个工具专门干一件事——统计拟合两组 SPEF 之间的偏差,自动推荐最优 scaling factor。

weixin_47770727的博客 548

【WRF模拟】保存wrf输出文件到指定目录+仅输出指定空间域/变量文件

修改wrf命令以更改指定输出文件目录等

WW、forever的博客 543

O_CLOEXEC的使用

父子进程文件描述符继承

混沌的博客 814

apollo自动驾驶进阶学习之:如何实现施工路段限速绕行及其参数调试

首先需要理解Planning模块是基于Scenario、Stage、Task这样的层次来进行的,即场景->步骤->具体的决策方法。Apollo可以应对自动驾驶所面临的不同道路场景,都是通过Scenario统一注册与管理。Scenario通过一个有限状态机来判断选择当前行车场景,每个Scenario下又有多个Stage,指当前场景下需要执行的粗略步骤。.........

qq_41593516的博客 6596

浅析linux下open函数O_CLOEXEC模式和fcntl函数FD_CLOEXEC选项

关于open函数O_CLOEXEC模式,fcntl函数FD_CLOEXEC选项,总结为如下几点: 1.调用open函数O_CLOEXEC模式打开的文件描述符在执行exec调用新程序中关闭,且为原子操作。 2.调用open函数不使用O_CLOEXEC模式打开的文件描述符,然后调用fcntl 函数设置FD_CLOEXEC选项,效果和使用O_CLOEXEC选项open函数相同,但分别调用

左雪菲的专栏 9120

假人有限元模型

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

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

open函数中O_CLOEXEC标志的开关

Linux中,文件描述符有一个属性:CLOEXEC,即当调用exec()函数成功后,文件描述符会自动关闭。在以往的内核版本(2.6.23以前)中,需要调用 fcntl(fd, F_SETFD, FD_CLOEXEC) 来设置这个属性。而新版本的(2.6.23开始)中,可以在调用open函数的时候,通过 flags 参数设置 CLOEXEC 功能,如 open(filename, O_CLOEXEC)。    虽然新版本支持在open时设置CLOEXEC,但是在编译的时候还是会提示错误 - error: ‘O

hiawui的专栏 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Linux 文件描述符标记之 FD_CLOEXEC

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

zhouguoqionghai的博客 2437

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

dc3120的专栏 2604

fcntl FD_CLOEXEC

关于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/control

魔戒 1056

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

close_on_exec解决的问题类型: 我们经常会碰到一个进程需要fork出子进程的情况,而且子进程很可能会继续exec新的程序。这就不得不提到如何妥善处理好子进程中无用文件描述符的问题。 fork函数的使用本不是这里讨论的话题,但必须提一下的是:子进程以写时复制(COW,Copy-On-Write)方式获得父进程的数据空间、堆和栈副本,这其中也包括文件描述符。刚刚fork成功时,父子进程中相同的文件描述符指向系统文件表中的同一项(这也意味着他们共享同一文件偏移量)。 接着,一般子进程会调用exec

To the beyond and infinity! 1277

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

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

liulilittle的博客 1585

java开关函数_open函数中O_CLOEXEC标志的开关 | 学步园

man open里有这么一个flag:O_CLOEXEC (Since Linux 2.6.23)Enable the close-on-exec flag for the new file descriptor. Specifying this flag permits a program to avoid additional fcntl(2) F_SETFDoperations ...

weixin_36080842的博客 477

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

我们经常会碰到需要fork子进程的情况,而且子进程很可能会继续exec新的程序。这就不得不提到子进程中无用文件描述符的问题! fork函数的使用本不是这里讨论的话题,但必须提一下的是:子进程以写时复制(COW,Copy-On-Write)方式获得父进程的数据空间、堆和栈副本,这其中也包括文件描述符。刚刚fork成功时,父子进程中相同的文件描述符指向系统文件表中的同一项(这也意味着

少想多做 1246

多线程语义下的fork O_CLOEXEC close-on-exec

man 2 open man eventfd O_CLOEXEC (since Linux 2.6.23) Enable the close-on-exec flag for the new file descriptor. Specifying this flag permits a program to avoid additional fcntl(2) F_SETFD opera...

ChengChengCheng的博客 358

fcntl设置FD_CLOEXEC

这是fcntl的一个Flag标志。 fcntl(fd, F_SETFD, FD_CLOEXEC); // 这里设置为FD_CLOEXEC表示当程序执行exec函数时本fd将被系统自动关闭,表示不传递给exec创建的新进程, 如果设置为fcntl(fd, F_SETFD, 0);那么本fd将保持打开状态复制到exec创建的新进程中 FD_CLOEXEC用来设置文件的close-on-exec

铁匠Smith先生的专栏 5442
上一篇: object-c学习 - object-c和c的布尔类型
下一篇: shell学习 - awk入门
codingnote
博客等级 码龄12年 3粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值