2017-01-13 49 views
-1

执行子进程有没有一种安全和简单的方法,但不允许它访问父文件描述符?特别是在我的情况下发生这种情况:防止子进程继承文件描述符

  1. 父进程侦听套接字127.0.0.1:8000。

  2. 父进程使用exec来运行子进程。这个子进程分叉并启动一个守护进程。

  3. 父进程关闭。

守护进程现在保持打开文件描述符(一直监听端口8000)。

也许有一些命令可以在执行子进程之前关闭所有文件描述符?

如果您从Web服务器脚本调用'service someservice start''命令,则会出现此问题。

也许有一些命令,可以在一个“干净”的环境中运行的服务脚本,像:

run-detached service someservice start 

这将导致所有的文件描述符被关闭,环境变量被取消设置等 - 使服务运行的上下文尽可能地基本。

+2

查看['FD_CLOEXEC'](http://man7.org/linux/man-pages/man2/fcntl.2.html) – Patrick

+0

[你不是第一个做这个的人](http:// jdebp .eu。/ Softwares/nosh/bsd-service-command.html#Inheritance),但正确的做法是不要以这种方式启动守护进程并使用真正的服务管理,而不是寻找避免子进程的方法。 – JdeBP

+0

这是由'fork()'在exec()'新程序之前关闭不需要的文件描述符(或将它们标记为exec-on-exec)的程序。这不是你可以从外面强加给系统管理员的东西。 (关于编程方面的建议,你可能想去[如此])。 –

回答

0

无法关闭进程外部的文件描述符(出于很明显的原因)。

你可以做的一件事是为要在子过程中运行的程序创建一个小垫片,然后说服父母改为exec()(例如,通过将其放置在原来的位置)。这个小程序可以关闭文件描述符,然后执行原始程序。

+0

我希望有一个标准的Linux命令能够fork,然后fork关闭除std *之外的FD,然后运行一个进程,然后父级等待fork完成,然后再返回到主程序。这应该是一个常见的情况。 – frodeborli