为什么close_on_exec不是默认配置?

时间:2012-03-06 12:36:09

标签: linux exec

由于似乎无法在exec之后使用已打开的fd,

为什么这个标志不是默认的?

3 个答案:

答案 0 :(得分:3)

文件描述符可以exec次呼叫后使用;这就是Unix实用程序如何从shell获取标准输入/输出/错误fds,例如。

Close-on-exec不是默认值,因为POSIX standard(和Unix传统)强制执行相反的行为:

  

调用过程映像中打开的文件描述符应在新过程映像中保持打开状态,但设置了close-on-exec标志FD_CLOEXEC的除外。

答案 1 :(得分:2)

因为在UNIX上,最常用的功能之一是进程之间的管道流 - 如果设置了CLOEXEC标志,则不能这样做(子进程不能继承文件描述符,例如:STDOUT_FILENO)。

不,不能在exec之后使用继承的文件描述符(例如:标准流)。只要知道它的值(它是一个整数),您也可以使用任何继承的文件描述符。此值通常通过参数传递给子进程(很多UNIX程序都会这样做),或者您可以使用您选择的任何IPC(进程间通信)机制以任何其他方式执行此操作。

答案 2 :(得分:0)

我不介意为此获得更完整的答案,但为了向后兼容,很容易猜到它。必须在某个时候引入close-on-exec标志。在此之前存在的代码对此并不了解,除非更改,否则无法正常工作。因此默认情况下它已关闭。

不幸的是,由于这种情况发生错误,分支cgi的守护程序进程可能会使侦听套接字打开,如果cgi没有退出或关闭它,则守护程序无法重新启动。所以我同意你的看法,这不是一个很好的默认。