使用FD_CLOEXEC實現close-on-exec,關閉子程式無用檔案描述符
http://blog.csdn.net/chrisniu1984/article/details/7050663
我們經常會碰到需要fork子程式的情況,而且子程式很可能會繼續exec新的程式。這就不得不提到子程式中無用檔案描述符的問題!
fork函式的使用本不是這裡討論的話題,但必須提一下的是:子程式以寫時複製(COW,Copy-On-Write)方式獲得父程式的資料空間、堆和棧副本,這其中也包括檔案描述符。剛剛fork成功時,父子程式中相同的檔案描述符指向系統檔案表中的同一項(這也意味著他們共享同一檔案偏移量)。
接著,一般我們會呼叫exec執行另一個程式,此時會用全新的程式替換子程式的正文,資料,堆和棧等。此時儲存檔案描述符的變數當然也不存在了,我們就無法關閉無用的檔案描述符了。所以通常我們會fork子程式後在子程式中直接執行close關掉無用的檔案描述符,然後再執行exec。
但是在複雜系統中,有時我們fork子程式時已經不知道開啟了多少個檔案描述符(包括socket控制程式碼等),這此時進行逐一清理確實有很大難度。我們期望的是能在fork子程式前開啟某個檔案控制程式碼時就指定好:“這個控制程式碼我在fork子程式後執行exec時就關閉”。其實時有這樣的方法的:即所謂的 close-on-exec。
close-on-exec的實現只需要呼叫系統的fcntl就能實現,很簡單幾句程式碼就能實現:
這樣,當fork子程式後,仍然可以使用fd。但執行exec後系統就會欄位關閉子程式中的fd了。
-------------------------------------------------------- 分割線 ------------------------------------------------------------------------------------
最近好好看了一下open函式,其中flags引數可以傳入O_CLOEXEC標記 [注意:linux 2.6.23才開始支援此標記]
相關文章
- Qt啟動子程式,子程式關閉時通知主程式,實現主程式對子程式的管理QT
- 檔案描述符
- Linux檔案描述符Linux
- 檔案描述符和檔案系統
- C++如何關閉檔案C++
- 實現關閉程式函式,殺掉pchunter函式
- 檔案包含之包含了Linux檔案描述符Linux
- linux中的檔案描述符Linux
- js實現使用檔案流下載csv檔案JS
- 關於node實現檔案上傳
- windows 檔案描述符 _open_osfhandleWindows
- Linux--檔案描述符、檔案指標、索引節點Linux指標索引
- 使用Spring實現上傳檔案Spring
- 使用Servlet實現檔案下載Servlet
- 02 使用配置檔案+反射實現反射
- linux的I/O重定向和管道的檔案描述符運用,及shell如何實現多執行緒?Linux執行緒
- 使用screen讓關閉ssh連線時不關閉程式
- 使用Flask-Dropzone在Flask程式中實現檔案上傳Flask
- HiveServer2 檔案描述符洩漏HiveServer
- win10系統關閉“最近使用的檔案”功能的方法Win10
- powershell 關閉遠端開啟的檔案
- 關閉單個檔案eslint的檢測EsLint
- 關閉tomact被佔用的程式Mac
- 使用dompdf/dompdf實現生成pdf檔案
- win10關閉檔案安全警告操作方法 win10開啟檔案安全警告怎麼關閉Win10
- bat檔案用echo列印變數顯示ECHO IS OFF/ECHO已關閉BAT變數
- 使用無伺服器實現檔案處理的批處理 - DZone Cloud伺服器Cloud
- java 語音用xml檔案實現圖形介面 xml檔案JavaXML
- 實驗7 檔案應用程式設計程式設計
- 用一個檔案,實現迷你 Web 框架Web框架
- 關於使用 go cron 庫(任務排程)平滑關閉的實現Go
- Linux下利用檔案描述符恢復的成功失敗實驗Linux
- python多程式實現檔案海量複製Python
- PHP 實現平滑關閉/重啟PHP
- 教你Python使用shutil操作檔案、subprocess執行子程式的方法Python
- Rosbag使用:bag檔案視覺化實現ROS視覺化
- 使用Spring Boot實現檔案上傳功能Spring Boot
- Win10系統怎樣關閉Windows檔案保護 win10關閉windows檔案保護的步驟Win10Windows
- springcloud修改父和子pom檔案,實現統一管理SpringGCCloud