关于close-on-exec标志

2023-11-19

每个文件描述符都有一个close-on-exec标志。默认情况下,这个标志最后一位被设置为 0。这个标志符的具体作用在于当开辟其他进程调用exec() 
族函数时,在调用exec函数之前为exec族函数释放对应的文件描述符。

    1. 我们来看一下具体的实例:

这是两个程序: file:fcntl 
代码 
int main()
{
pid_t pid;
fd = open("test.txt",O_RDWR|O_APPEND);
if (fd == -1)
##printf("open err\n");
printf("fd = %d",fd);
printf("fork!\n");
fcntl(fd, F_SETFD, 1);                     
char *s="ooooooooooooooooooo";
pid = fork();
if(pid == 0)
execl("ass", "./ass", &fd, NULL);

wait(NULL);

write(fd,s,strlen(s));
close(fd);

return 0;
}

ass 源代码 
int main(int argc, char *argv[]) 
{
int fd;
printf("argc = %d ",argc);
fd = *argv[1];
printf("fd = %d",fd);
char *s = "zzzzzzzzzzzzzzzzzzz";
write(fd, (void *)s, strlen(s));
close(fd);
return 0;
}
PS:那个test.txt提前已经创建 为空文件~

fcntl(fd, F_SETFD, 1) 此句将fd的close-on-exec 标志设置为1,开启此标志。那么当子进程调用execl函数
时,execl执行ass,ass是不能向fd内写入的,因为在调用execl函数之前系统已经讲子进程的此文件描述符关闭了。(attention:这里是子进程!)
但是如果将 fcntl(fd, F_SETFD, 1) 
改为
fcntl(fd, F_SETFD, 0) 
或者直接将此句注释掉,那么,ass便可以向这个文件描述符中任意添写东西了~~ 
PS:如果将fcntl设置为开启,即设置为1,那么, 此文件描述符依然是可以被主进程操作的。 
下面将程序执行的结过给大家: 
当执行此句fcntl(fd, F_SETFD, 1) 
fd = 3fork! 
argc = 2 fd = 3 
test.txt中的内容为: 
ooooooooooooooooooo 
当将fcntl(fd, F_SETFD, 1)注释掉或者将 1改为 0时 
结果: 
fd = 3fork! 
argc = 2 fd = 3lost 
test.txt中的内容为: 
zzzzzzzzzzzzzzzzzzoooooooooooooooooooooo
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于close-on-exec标志 的相关文章

随机推荐

  • 【Neo4j】第 1 章:图数据库

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Git安装与仓库配置(附带)

    Git的安装与仓库配置 前期准备 安装与配置 安装Git 注册账户 环境配置 配置用户名与邮箱 生成SSH 添加SSH 配置仓库 仓库建立 初始化仓库 提交文件操作 Git 的基本语法总结 总结小话 前期准备 下载Git安装包 根据需求不同
  • oracle bitmap join index

    下面是官网对于位图联合索引的说明 Use the bitmap join index clause to define a bitmap join index A bitmap join index is defined on a sing
  • centos6.5下php添加pdo_mysql扩展

    我的Mysql是用RPM方式安装的 PHP5 5是用源码编译安装的 查看phpinfo 后 发现没有pdo mysql扩展 进去到php的源码包的ext中 root linux php cd usr local src php 5 5 18
  • 最常用的五大算法

    一 贪心算法 贪心算法 又称贪婪算法 是指 在对问题求解时 总是做出在当前看来是最好的选择 也就是说 不从整体最优上加以考虑 他所做出的仅是在某种意义上的局部最优解 贪心算法不是对所有问题都能得到整体最优解 但对范围相当广泛的许多问题他能产
  • tomcat发布必须配置JAVA_HOME,但可以不配置CATALINA_HOME

    在同一台服务器上 使用tomcat 发布多个应用是经常的事情 经常出现的问题 1 就是tomcat多个应用之间不能使用同一个端口 今天又遇到一个问题 纠结上好长时间 记录 之前发布第一个应用的时候 按照网上的java开发的配置 把CATAL
  • printk()和printf()的比较

    1 前言 print函数和printf函数是对孪生兄弟 在功能作用上几乎是一样的 在使用上有一些区别 1 printk 和printf 之间的一个显著区别在于printk 允许通过指定一个标志来设置优先级 从而决定这条打印是否需要打印出来
  • STM32 GPIO的学习

    1 GPIO的作用 目前我使用的是STM32F0xx系列 参考数据手册Memory Map处可以看到ST所有的外设寄存器均处于Peripherals处 地址范围为0x40000 0000 0x48001800 其中包含了APB1 APB2
  • 孤立森林的简要记录

    20200920 0 引言 在之前的时候 进行一些任务分类的时候 使用过孤立森林来实现一些代码 但是也没有具体来深究原理 只知道这个跟随机森林有些像 都是决策树的一种集成方式 最近正好看到了这部分内容 就正好记录一下 本部分内容主要是有文章
  • gorm报错reflect: reflect.Value.SetInt using unaddressable value

    reflect reflect Value SetInt using unaddressable value 这种报错是应该传地址的时候传了值导致的 经过检查 gorm包下的方法如Create的参数应该是地址 比如 err global D
  • 代码复现不稳定应该怎么调整

    tensorflow转为pytorch代码 复现结果浮动较大 尝试方法 在测试和验证部分加入 model eval 去掉训练部分的shuffle 保证每次送入的数据一样 设定各个部分的随机种子 random seed 42 np rando
  • 8种常见的 代码 编译 软件 !!

    VS Code Source Insight Vim UltraEdit eclipse Understand Atom Sublime Text 接下来详细为大家讲解一下它们各自的用途 目录 1 VS Code 2 Source Insi
  • 密码学哈希函数_哈希函数在密码学中的应用

    密码学哈希函数 A Hash Function is a mathematical function that converts a numerical value into another compressed numeric value
  • FullGC问题分析

    一 常见的FullGC场景分析 频繁的大对象 大对象直接被分配到老年代 系统高负载运行 请求量很大 jvm来不及将对象转移到老年代 直接到老年代分配对象 系统内存泄漏 导致对象长时间在老年代 得不到释放 二 产生FullGC的原因 Syst
  • Tracy 小笔记 Vue - 数据展示,基本指令,绑定属性 v-bind,v-for,条件渲染,强制渲染

    数据展示 插值操作 data 里的数据都是怎么显示在页面上的 Mustache 语法 胡须 也就是双大括号 变量 简单表达式 基本指令 v once 指令的使用 h2 message h2 如果需求是只显示最初的值 以后值不变 就要加这个指
  • MFC读写excel文件

    MyExcel cpp include stdafx h include MyExcel h CMyExcel CMyExcel StartApp CMyExcel CMyExcel books Close sheet ReleaseDis
  • Python爬虫进行接口测试

    一 爬虫概述 1 爬虫简介 UI页面的测试 除了定位元素和模拟操作外 更多的是需要收集一些数据并进行后续的逻辑处理 这时就需要使用爬虫技术来实现数据有爬取 爬虫技术也可以用于测试 例如通过爬虫对测试页面进行采集和分析 对功能点进行冒烟测试
  • QFile读取文件乱码问题

    2020 3 11 使用Qt的QFile打开文件时 中文输出乱码 知道是编码的问题 由于第一次接触Qt 所有不太清楚如何解决 查询一番 认识了一个类QTextCodec 感觉这个比较好 记在这里 方便日后复习 解决方法 QTextCodec
  • 通过反射来获取某个类中的构造方法,普通方法,属性

    反射 反射机制是在运行状态中 对于任意一个类 都能够知道这个类的所有属性和方法 对于任意一个对象 都能够用它的任意一个方法和属性 这种动态获取信息以及动态调用对象的方法的功能就是java中的反射机制 要想解剖一个类 必须先要获取到该类的字节
  • 关于close-on-exec标志

    每个文件描述符都有一个close on exec标志 默认情况下 这个标志最后一位被设置为 0 这个标志符的具体作用在于当开辟其他进程调用exec 族函数时 在调用exec函数之前为exec族函数释放对应的文件描述符 我们来看一下具体的实例