在Mac上運行的C/C++服務器應用程序(Darwin Kernel Version 10.4.0)中,我爲子進程派生並且希望這些子進程不繼承服務器的文件句柄(文件,套接字,管道......) 。似乎默認情況下,所有句柄都被繼承,甚至更多,netstat顯示子進程正在監聽服務器的端口。我該如何做這種類型的叉子?如何在沒有繼承句柄的情況下進行分支處理?
回答
不,你需要自己關閉它們,因爲只有你知道你需要保持打開或不打開哪些。
我不想保留任何他們開了。是否有一些方法可以讓叉子後的所有手柄都可用? –
嗯,你可以只爲'(i = 0; i <1024; ++ i)關閉(i);',或者如果你有很多連接的話可以更高。 (或者更好的辦法是使用'getrlimit(RLIMIT_NOFILE,fds);'就像@Maxim用來獲得最高的fd一樣) – hexist
基本沒有。你必須自己做。也許pthread_atfork
幫助,但它仍然是單調乏味的。
通常情況下,fork()
之後,但exec()
一個不getrlimit(RLIMIT_NOFILE, fds);
,然後關閉所有文件描述符比fds
低了。
此外,可以使用fcntl()
在文件描述符上設置,以便它們在exec()
上自動關閉。但是,這不是線程安全的,因爲在此線程打開新文件描述符之後但在設置標誌之前,另一個線程可以fork()
。
在Linux上,此問題已通過向open()
等功能添加O_CLOEXEC
標誌解決,因此無需額外的呼叫即可設置標誌。
如果你打算做'exec',你可以將所有的FD配置爲「close在執行「。但我的印象是,OP不會'執行'任何東西...... –
@KerrekSB是真的,但仍然可能想要執行結束循環,以確保沒有文件描述符被泄漏到新進程中,因爲設置'close-on-exec'在某處被忽略。 –
@KerrekSB,如果您調用某些第三方API或甚至某些OS功能,則您可能無法控制其中一個開放或其中一個分支。 – pilkch
- 1. 如何在沒有窗口句柄的情況下使用RegisterDeviceNotification?
- 2. 如何在沒有協變的情況下繼承是合理的? (C#)
- 3. 繼承的情況下,類
- 4. 在沒有使用語句的情況下處理IDisposable對象
- 5. PHP在沒有www的情況下繼續進行會話
- 6. 繼承Windows中父進程的句柄
- 7. 在沒有表映射的情況下繼承Hibernate對象
- 8. 無法在沒有引發System.NullReferenceException的情況下繼承控件
- 9. 在沒有繼承的情況下繪製到JPanel
- 10. 在沒有父母信息的情況下繼承BST
- 11. 如何在沒有嵌套IF ELSE語句的情況下處理Android onSharedPreferenceChanged
- 12. 如何在沒有ByRef的情況下處理異步函數?
- 13. 在沒有拆分的情況下在JavaScript中進行交換
- 14. 如何在繼承的情況下使用Mockito進行單元測試?
- 15. 如何在沒有繼承的情況下訪問組件的屬性
- 16. 防止多處理庫中的文件句柄繼承
- 17. 在沒有中繼的情況下在SVN倉庫中創建分支
- 18. 如何在沒有返回空列表的情況下繼承Python列表?
- 19. 如何在沒有「新」操作符的情況下使用原型繼承
- 20. 如何在沒有使用'name'屬性的情況下繼承一個函數?
- 21. 如何在沒有多重繼承的情況下做到這一點
- 22. 如何在沒有API的情況下在Android中執行圖像處理?
- 23. 如何在沒有承諾的情況下運行異步承諾?
- 24. 如何在沒有選擇的情況下進行左連接
- 25. 如何在沒有pdb文件的情況下進行調試?
- 26. 如何在沒有違規的情況下進行GROUP BY?
- 27. 如何在沒有Visual Studio的情況下進行調試?
- 28. 如何在沒有System.Web dll的情況下進行UrlDecode編程#
- 29. 如何在沒有jQuery的情況下進行AJAX調用?
- 30. 如何在沒有擴展名的情況下使用批處理運行exe
如果你在'fork()'之後執行'exec()',可能這個答案很有用:http://stackoverflow.com/a/1644590/1741542 –