文档章节

【转载】FD_CLOEXEC 的使用

摩云飞
 摩云飞
发布于 2013/05/14 09:27
字数 552
阅读 181
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>


通过fcntl设置FD_CLOEXEC标志有什么用?  


      close on exec, not on-fork, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行的程序里,此描述符被关闭,不能再使用它,但是在使用fork调用的子进程中,此描述符并不关闭,仍可使用。

      我们经常会碰到需要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了。



本文转载自:http://blog.csdn.net/jhonguy/article/details/8194671

摩云飞
粉丝 377
博文 534
码字总数 952694
作品 0
徐汇
程序员
私信 提问
加载中

评论(0)

muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor 标签: muduo Connector Acceptor [TOC] 本篇继续为前面封装的EventLoop添加事件,到现在共给EventLoop添加了两个fd,Timerfd,Eve...

osc_04fmvbv4
2018/11/17
3
0
Linux Timer定时器【转】

转自:https://www.jianshu.com/p/66b3c75cae81 timerfd为Linux为用户程序提供的定时器接口,该接口基于文件描述符,通过文件描述符的可读事件进行超时通知,且能够被用于epoll/select。主要...

osc_d5exiys5
2018/07/13
2
0
linux环境下无文件执行elf

linux环境下无文件执行elf https://blog.spoock.com/2019/08/27/elf-in-memory-execution/ 说明 有关linux无文件渗透执行elf的文章晚上已经有非常多了,比如In-Memory-Only ELF Execution (W...

lsgxeva
前天
0
0
C++编程:socket设置为非阻塞方式(windows和linux)1

Windows用以下方法将socket设置为非阻塞方式 :   unsigned long ul=1;   SOCKET s=socket(AFINET,SOCKSTREAM,0);   int ret=ioctlsocket(s, FIONBIO, (unsigned long *)&ul);//设置成......

阳666
2015/12/02
985
0
linux popen()与system()的区别

linux popen()与system()的区别 popen() 可以在调用程序和POSIX shell /usr/bin/sh 要执行的命令之间创建一个管道(请参阅sh-posix(1) )。 popen() 的参数是指向以空字符结尾的字符串的指针...

osc_z81q0lie
2018/01/25
1
0

没有更多内容

加载失败,请刷新页面

加载更多

数据结构和算法 | 第一部分第五课:算法复杂度实践

>作者 谢恩铭,公众号「程序员联盟」。 转载请注明出处。 原文:https://www.jianshu.com/p/060ef52580af >《数据结构和算法》全系列 内容简介 前言 寻找最大和最小的元素 寻找不重复的元素 ...

程序员联盟_
3分钟前
0
0
tomcat项目改造->jerryrat

先做一点笔记防止自己忘了,还有很多小细节要慢慢调试, 有些其实也不是漏洞,但是等保测试有些特殊的情况,只能去做兼容性的处理 1:编译tomcat8 https://tomcat.apache.org/download-80.cgi...

国产大熊猫
3分钟前
25
0
aop:aspect与aop:advisor的区别

https://www.jianshu.com/p/40f79da0cdef

osc_6jhxf9ab
4分钟前
12
0
Python破解24点游戏,从此打扑克就没输过

文源网络,仅供学习之用,如有侵权请联系删除。 24点游戏 对于任意给定的四张扑克牌,计算是否有赢得24点游戏的方法(即使用加、减、乘、除四则运算凑成24的方法);如果有的话,列出所有可能...

Python圈子
4分钟前
12
0
阿里短信回执.net sdk的bug导致生产服务cpu 100%排查

一:背景 1. 讲故事 去年阿里聚石塔上的所有isv短信通道全部对接阿里通信,我们就做了对接改造,使用阿里提供的.net sdk。 网址:https://help.aliyun.com/document_detail/114480.html 同事...

osc_slnrw1du
5分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部