close-on-exec的FD_CLOEXEC标志问题

9月19日成都OSC源创会火热报名 —— 送机械键盘和开源内裤  

在看关于网络编程的东西。

经常看到有写这下面这段的。但是一直搞不明白什么意思。

?
1
2
3
int flags = fcntl(fd, F_GETFD); 
flags |= FD_CLOEXEC; 
fcntl(fd, F_SETFD, flags);

baidu了下,大约是这么说的。

1,“如果调用了exec(),应该关闭指定的套接字” (Libevent手册中)

2,“如果设置了此选项,则连接监听器设置所涉及的监听器套接字以close-on-exec标志。”(Libevent手册中解释参数‘LEV_OPT_CLOSE_ON_EXEC’)

3,“一般我们会调用exec执行另一个程序,此时会用全新的程序替换子进程的正文,数据,堆和栈等。此时保存文件描述符的变量当然也不存在了,我们就无法关闭无用的文件描述符了。所以通常我们会fork子进程后在子进程中直接执行close关掉无用的文件描述符,然后再执行exec。”(另一个网页文章的解释)

[此解释有疑问。如果按此解释,那系统都直接每次设置FD_CLOEXEC就行了。可以去除此设置标志了,系统只要一发现调用exec就关闭所有文件描述符,多简单,没必要有此标志位了。]

理解和惑的是:

假设A程序有1,2子进程。子进程2可能打开了网络端口或是文件,已经生成有文件描述符x,然后子进程2需要调用exec加载另一个程序。一般情况下,我们会按自己的需要给子进程的文件描述符x写上销毁指令,比如关闭端口等,所以一般FD_CLOEXEC标志是不用管的。难道有一些情况我们没办法销毁造成文件描述符耗尽?啥情况?

有达人指教吗。。迷糊了一天了。

 

hapming hapming
发帖于 3年前
2回/1203阅

按票数排序  显示最新答案  共有2个答案 (最后回答: 3年前 )

  • 0
  • mingshun

    假设在某个情况下,父进程需要将子进程的标准I/O重定向到某个文件,但子进程无需或不能或没法知道此文件,总之就是不能通过open来打开。如果父进程打开的文件描述符都在exec时关闭的话,那子进程就没法访问这个文件了?

    上面只是一种情况而已!

    评论(0)引用此答案举报 (2012-08-01 11:18)
    0
  • hapming

    我想我知道原因了。这里分享一下我的理解。按照我所看到那份源码来说明。

    程序设置了FD_CLOEXEC,可能是为了调用exec重新载入本进程以便更新。该程序中可能打开了大量接口与外面通讯。使用exec重新加载后,并没有释放文件描述符,而重新加载的程序不知道前一个程序都有哪些文件描述符打开了。这样多次重载后会快速耗尽文件描述符。

    不知这样理解是否正确。不过如果程序不是很复杂的话,倒是应该可以把文件描述符放在一起,调用exec之前先检查文件描述符并关闭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值