2017-01-13 50 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