2012-10-24 75 views
2

在Mac上運行的C/C++服務器應用程序(Darwin Kernel Version 10.4.0)中,我爲子進程派生並且希望這些子進程不繼承服務器的文件句柄(文件,套接字,管道......) 。似乎默認情況下,所有句柄都被繼承,甚至更多,netstat顯示子進程正在監聽服務器的端口。我該如何做這種類型的叉子?如何在沒有繼承句柄的情況下進行分支處理?

+1

如果你在'fork()'之後執行'exec()',可能這個答案很有用:http://stackoverflow.com/a/1644590/1741542 –

回答

1

不,你需要自己關閉它們,因爲只有你知道你需要保持打開或不打開哪些。

+0

我不想保留任何他們開了。是否有一些方法可以讓叉子後的所有手柄都可用? –

+1

嗯,你可以只爲'(i = 0; i <1024; ++ i)關閉(i);',或者如果你有很多連接的話可以更高。 (或者更好的辦法是使用'getrlimit(RLIMIT_NOFILE,fds);'就像@Maxim用來獲得最高的fd一樣) – hexist

0

基本沒有。你必須自己做。也許pthread_atfork幫助,但它仍然是單調乏味的。

7

通常情況下,fork()之後,但exec()一個不getrlimit(RLIMIT_NOFILE, fds);,然後關閉所有文件描述符比fds低了。

此外,可以使用fcntl()在文件描述符上設置,以便它們在exec()上自動關閉。但是,這不是線程安全的,因爲在此線程打開新文件描述符之後但在設置標誌之前,另一個線程可以fork()

在Linux上,此問題已通過向open()等功能添加O_CLOEXEC標誌解決,因此無需額外的呼叫即可設置標誌。

+0

如果你打算做'exec',你可以將所有的FD配置爲「close在執行「。但我的印象是,OP不會'執行'任何東西...... –

+0

@KerrekSB是真的,但仍然可能想要執行結束循環,以確保沒有文件描述符被泄漏到新進程中,因爲設置'close-on-exec'在某處被忽略。 –

+0

@KerrekSB,如果您調用某些第三方API或甚至某些OS功能,則您可能無法控制其中一個開放或其中一個分支。 – pilkch

相關問題