【转载】FD_CLOEXEC 的使用

通过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就能实现,很简单几句代码就能实现:

?


1

2

3

4

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了。

时间: 2024-11-01 14:48:36

【转载】FD_CLOEXEC 的使用的相关文章

【转载】Jenkins + Git + Maven + tomcat集成环境搭建

本文转载自http://shift-alt-ctrl.iteye.com/blog/2208786   折腾了好几天,终于吧Jenkins + Git + Maven + tomcat集成环境搭建起来了,最终主要实现"自动构建.部署"web应用.   1.安装环境     操作系统:Centos 6.5     JDK:1.7.x     Maven:3.1.x     Git: 1.7.1,自建GitLab平台     tomcat:7.x       上述宿主机器2台:192.16

完美解决layDate强制动态显示当前时间(不求评论,但求疯狂转载!)

**只给懂我的你** 强烈建议喜欢装逼(B)的使用上面的2.0版,优化了相关代码,封装了js,速度你懂得,O(∩_∩)O哈哈~, laydate2.0强势来袭:http://download.csdn.net/detail/cometwo/9371372 layDate默认是不显示时间的,实在是操蛋,现自己动手,现修源文件208行如下: 工程下载:你妈CSDN今天抽风,上传不了工程,改天传,急的加QQ:3120217729,我给你发,还是那句话:不求评论,但求疯狂转载!转转转 至此还是向@贤心同

软件架构模式转载

概要介绍 最近一两年,转载文章越来越少了,之所以转载这篇文章,是因为看这篇文章,弄明白了我的一些问题.所以梳理了一下,结合了几篇文章. 架构模式可以帮助你定义程序的基本特征和行为.例如一些架构模式很自然让程序成为大规模(scalable)的程序.有些模式让程序变得灵巧敏捷(agile).知道这些架构的特征,优点和缺点,你就可以根据你特定的业务需求和目标从容的选择一种架构模式.作为一位架构师,你总会为自己架构选择做解释,尤其你选择一个特别的架构模式的时候.O'Reilly的这本书提供了充足的信息来

【转载】低成本和高性能的MySQL云数据库的实现淘宝 MySQL

低成本和高性能的MySQL云数据库的实现 作者: 鸣嵩/曹伟(集团技术专家) 本文刊登于<程序员>杂志2012年12期上,转载请注明         UMP(Unified MySQL Platform)系统是淘宝核心系统数据库团队开发的低成本和高性能的MySQL云数据方案,关键模块采用Erlang语言实现.系统中包含了controller服务器.proxy服务器.agent服务器.API/Web服务器.日志分析服务器.信息统计服务器等组件,并且依赖于Mnesia.LVS.RabbitMQ.Z

[转载]JDK自带VM分析工具jps,jstat,jmap,jconsole

一.概述      SUN 的JDK中的几个工具,非常好用.秉承着有免费,不用商用的原则.以下简单介绍一下这几种工具.(注:本文章下的所有工具都存在JDK5.0以上版本的工具集里,同javac一样,不须特意安装)  .           我一共找到以下四个工具:重点看看jconsole和jmap. jps :与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. jstat :一个极强的监视VM内存工具.可以用来监视VM内存内的各种堆和非堆

[转载] 黄志敏:一条数据新闻是如何用7步生产出来的?

PS:文章主要转载自36大数据的文章:           http://www.36dsj.com/archives/33280      最近同学找工作,在百度搜索引擎面试时就被问到"一条新闻是如何被发现的呢?"我能想到就是实时性,某段时间内突然关注的词汇可能是新闻,再或则是通过模板打分判断.      下面这篇文章就详细讲述了一条数据新闻是如何产生的?遗憾的是没有论述如何探索一条信息是有价值的新闻.但同样希望对你有所帮助,尤其是从事搜索引擎.信息挖掘相关的专业或面试的同学. 9月

[转载收藏]Ubuntu中设置samba共享可读写文件夹

在Ubuntu中设置samba共享可读写文件夹,需要在windows中通过iSCSI挂盘,或者使用samba来设置共享: samba安装方法如下:  代码: sudo apt-get install samba sudo apt-get install smbfs 下面我们来共享群组可读写文件夹,假设你要共享的文件夹为: /home/ray/share 首先创建这个文件夹 代码: mkdir /home/ray/share chmod 777 /home/ray/share 备份并编辑smb.c

消息队列和管道的区别(转载)

转载自:http://bbs.chinaunix.net/viewthread.php?tid=265266 作者:beginner-bj 请问管道和消息队列有什么不同  管道通信(PIPE) 管道通信方式的中间介质是文件,通常称这种文件为管道文件.两个进程利用管道文件进行通信时,一个 进程为写进程,另一个进程为读进程.写进程通过写端(发送端)往管道文件中写入信息:读进程通过读 端(接收端)从管道文件中读取信息.两个进程协调不断地进行写.读,便会构成双方通过管道传递信息 的流水线. 利用系统调用

【转载】关于时间、时区、系统时间和硬件时间

(文章为转载,针对部分表达不明确或错误的地方进行了修正)  时区(Time Zone)是用于划分地球上.使用同一时间定义的区域而产生的概念.1884年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划分为24个时区. 一.以下是一些术语的解释 格林威治标准时间 GMT十七世纪,格林威治皇家天文台为了海上霸权的扩张计划,而进行天体观测.1675年旧皇家观测所(Old Royal Observatory) 正式成立,到了1884年决定以通过格林威治的子午线作为划分地球东西两半球的经度零度