【转载】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了。


目录
相关文章
|
3月前
|
Linux
内核态的文件操作函数:filp_open、filp_close、vfs_read、vfs_write、set_fs、get_fs
内核态的文件操作函数:filp_open、filp_close、vfs_read、vfs_write、set_fs、get_fs
75 0
|
4月前
|
Linux
linux文件描述符fd
linux文件描述符fd
23 0
|
5月前
|
存储 Unix Linux
关于epoll和mmap的思考
epoll 是 Linux 操作系统提供的一种 I/O 多路复用机制,用于监视多个文件描述符(通常是套接字、管道或文件),并在其中的某个文件描述符准备好读或写时通知应用程序。它是一种高效的事件通知机制,特别适用于高性能的网络应用程序,如 Web 服务器和代理服务器。
|
10月前
|
Linux 开发工具 索引
Linux重定向文件描述符FD
我们知道在Linux系统中的一切都可以被视为文件,文件可以分为:普通文件、目录文件、链接文件和设备文件。在操作这些所谓的文件时,我们每次都会找到一个名字,这需要很多时间和效率。Linux规定每个文件对应一个索引,以便在操作文件时,我们可以直接找到索引进行操作。 文件描述符(file descriptor)为了有效地管理这些已经打开的文件创建的索引,它是一个非负整数(通常是小整数),用于指代打开的文件,所有执行I/O操作系统的呼叫是通过文件描述符实现的。同时,还规定,当系统刚刚启动时,0是标准输入,1是标准输出,2是标准错误。
72 0
系统编程之文件IO(六)——获取文件属性(stat、fstat、lstat、struct stat)
系统编程之文件IO(六)——获取文件属性(stat、fstat、lstat、struct stat)
系统编程之文件IO(六)——获取文件属性(stat、fstat、lstat、struct stat)
|
监控 网络协议 Java
netstat统计的tcp连接数与⁄proc⁄pid⁄fd下socket类型fd数量不一致的分析
新blog地址: http://hengyunabc.github.io/netstat-difference-proc-fd-socket-stat/ 最近,线上一个应用,发现socket数缓慢增长,并且不回收,超过警告线之后,被运维监控自动重启了。
2008 0
|
缓存 Unix Java
struct sk_buff与socket
struct sk_buff与socket作者:gfree.wind@gmail.com 原文:http://blog.chinaunix.net/u3/116859/showart.php?id=2441552 在Linux2.6中,struct sk_buf承担了socket的输入输出的传输缓存的任务。
1380 0
|
网络协议 Linux 缓存
struct s_mbuf与struct sk_buff
struct s_mbuf与struct sk_buff本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
1282 0
buf.readInt8函数详解
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.
822 0