为什么不是close_on_exec的默认configuration?

由于在exec之后似乎没有办法使用已经打开的fd,

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

文件描述符可以通过exec调用使用; 这就是Unix工具如何从shell获得标准输入/输出/错误的fds。

Close-on-exec并不是默认的,因为POSIX标准 (和Unix传统)要求相反的行为:

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

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

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

我不介意得到更完整的答案,但很容易猜测它是为了向后兼容。 关闭执行标志必须在某个时候推出。 从那之前存在的代码不知道它,并且不会正确地工作,除非改变。 所以默认关闭

不幸的是,由于这个原因,一个守护进程派生一个CGI可能会使监听套接字打开,如果CGI没有退出或关闭它,守护进程将无法重新启动。 所以我同意你的意见,这不是一个很好的默认。