【发布时间】:2012-03-06 12:36:08
【问题描述】:
由于exec之后似乎没有办法使用已经打开的fd,
为什么这个标志不是默认的?
【问题讨论】:
由于exec之后似乎没有办法使用已经打开的fd,
为什么这个标志不是默认的?
【问题讨论】:
文件描述符可以在exec调用之后使用;例如,这就是 Unix 实用程序从 shell 获取标准输入/输出/错误 fds 的方式。
Close-on-exec 不是默认设置,因为 POSIX standard(和 Unix 传统)要求相反的行为:
在调用进程映像中打开的文件描述符应在新进程映像中保持打开状态,但设置了 close-on-exec 标志
FD_CLOEXEC的文件描述符除外。
【讨论】:
因为在 UNIX 上,最常用的功能之一是/曾经是进程之间的管道流 - 如果设置了 CLOEXEC 标志(子进程不能继承文件描述符,例如:STDOUT_FILENO),您就不能这样做。
不,您不能在 exec 之后使用继承的文件描述符(例如:标准流)。只要您知道它的值(它是一个整数),您也可以使用任何继承的文件描述符。该值通常通过参数传递给子进程(很多 UNIX 程序这样做),或者您可以使用您选择的任何 IPC(进程间通信)机制以任何其他方式执行此操作。
【讨论】:
我不介意得到一个更完整的答案,但很容易猜到它是为了向后兼容。必须在某个时候引入 close-on-exec 标志。在那之前存在的代码对此一无所知,除非进行更改,否则将无法正常工作。因此默认情况下它是关闭的。
不幸的是,因此会发生错误,派生 cgi 的守护进程可能会使侦听套接字保持打开状态,如果 cgi 没有退出或关闭它,则无法重新启动守护进程。所以我同意你的观点,这并不是一个很好的默认值。
【讨论】: