使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符
来源:互联网 发布:linux apt get 安装 编辑:程序博客网 时间:2024/05/16 11:38
- close on exec, not on-fork, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行的程序里,此描述符被关闭,不能再使用它,但是在使用fork调用的子进程中,此描述符并不关闭,仍可使用。
- 通过fcntl设置FD_CLOEXEC标志有什么用?
- close on exec, not on-fork, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行的程序里,此描述符被关闭,不能再使用它,但是在使用fork调用的子进程中,此描述符并不关闭,仍可使用。
我们经常会碰到需要fork子进程的情况,而且子进程很可能会继续exec新的程序。这就不得不提到子进程中无用文件描述符的问题!
fork函数的使用本不是这里讨论的话题,但必须提一下的是:子进程以写时复制(COW,Copy-On-Write)方式获得父进程的数据空间、堆和栈副本,这其中也包括文件描述符。刚刚fork成功时,父子进程中相同的文件描述符指向系统文件表中的同一项(这也意味着他们共享同一文件偏移量)。
接着,一般我们会调用exec执行另一个程序,此时会用全新的程序替换子进程的正文,数据,堆和栈等。默认子进程的文件描述符复制到exec后的进程中,这样的话,如果父进程关闭(killall *)之后,也无法调用驱动程序中的release函数来释放文件struct file 结构,当子进程结束(killall *)时,才会调用realse函数释放open打开的文件。所以通常我们会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了,如果不设置该close_on_exec标志位,子进程的fd将复制到exec之后的进程中。
- 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符
- 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符
- 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符
- 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符
- 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符
- 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符
- 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符
- 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符
- 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符 http://blog.csdn.net/chrisniu1984/article/details/7050663
- close-on-exec的FD_CLOEXEC标志问题
- 关于文件描述符的close-on-exec标志位
- 有关Linux文件描述符中的close on exec标志位
- 文件描述符的FD_CLOEXEC标志
- 子进程关闭从父进程继承来的文件描述符
- 关于linux进程间的close-on-exec机制
- 关于linux进程间的close-on-exec机制
- fcntl设置FD_CLOEXEC && fcntl(文件描述符操作)
- exec与文件描述符
- DISCUZ浅析之COOKIE篇
- almostSorted
- 浅谈STL中的find及其扩展函数
- 【转载】char*,const char*和string 三者转换
- Linux系统编程——系统调用之 I/O 操作(文件操作)
- 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符
- android应用之——为自己的apk签名
- 《Hadoop基础教程》之初识Hadoop
- 微信自定义菜单
- Htrace on Hadoop, Hbase and HbaseClient
- Android开发之查看应用包名package和入口activity名称的方法
- jdk:HashMap
- Duilib界面库中的CSize、CPoint、CRect和afxwin.h冲突
- 相似度计算方法总结