2014-04-12 82 views
0

我有一個大程序。它非常喜歡打開文件(與他們合作,數量可能巨大 - 超過10k)。在某個時候,我想要誕生一個能夠過上自己生活的子過程(在過程之外的網絡瀏覽器)。由於其大小(> 10GB代碼)和第三方(插件以及)依賴關係,我不控制在我的主程序中創建文件的人員和方式。我想要:如何枚舉文件描述符? (叉後關閉它們)

  • O_CLOEXEC/FD_CLOEXEC默認情況下。我懷疑沒有這種能力。或者
  • 一種枚舉所有文件(套接字,管道等)描述符的方法,以便能夠在fork之後關閉它們。感興趣的操作系統:Mac OS X和Linux。
+0

「我不控制在我的主程序中創建文件的人和方式」。你能更清楚地解釋一下嗎? – Sanketh

+0

時間只是蹩腳的代碼,像網絡和磁盤的幾個領域。大型圖書館,其中一些是第三方。這就是說,如果我在某個庫的幫助下打開一個文件,我不控制如何在其中打開文件,因此無法設置FD_CLOEXEC標誌。 –

+0

讓你的程序維護一個你想做的**的小列表,並且關閉所有的fds,除了這個列表中的列表。 – wildplasser

回答

0

默認情況下設置close-on-exec是不可能的(相關:how to set close-on-exec by default)。

枚舉進程中的所有文件描述符,可以在Linux中查找/proc/PID/fd/。 但是,在Mac OS X中,除了使用lsof(8)實用程序之外,我沒有任何編程式解決方案。在Linux上也可以使用 lsof(8)

編輯: 或者,您可以覆蓋open(2)調用指定默認O_CLOSEXEC和運行在Linux上使用LD_PRELOAD程序。 對於Mac,請按照What is the exact equivalent to LD_PRELOAD on OSX?

+0

啓動外部lsof似乎有點錯......謝謝你的linux選項。 –

+0

@dev_null如何覆蓋打開(2)電話? –

+0

這是可能的,我甚至做過類似的事情,但並非所有事情都是通過公開的方式打開的。所以應該有一套功能和任務很快變得複雜。更多在Mac上我應該關心2級命名空間,如果我想處理所有情況(http://stackoverflow.com/questions/20387225/how-libgmalloc-work-with-two-level-namespaces) –

3

文件描述符都是小正整數,所以你可以枚舉它們並關閉它們。關閉一個未打開的將導致錯誤,但您可以忽略:

#include <sys/resource.h> 
struct rlimit lim; 
getrlimit(RLIMIT_NOFILE, &lim); 
for (int i = 3; i < lim.rlim_cur; i++) 
    close(i); // close all file descriptors other that stdin/stdout/stderr 
+0

殺死他們所有。 Linux會知道它自己的。 –