使用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才開始支援此標記]
相關文章
- 關於檔案描述符的close-on-exec標誌位
- 關閉應用程式時如何關閉子執行緒執行緒
- Qt啟動子程式,子程式關閉時通知主程式,實現主程式對子程式的管理QT
- 在父子程式間用管道傳遞檔案描述符
- 檔案描述符
- 檔案描述符和檔案系統
- C++如何關閉檔案C++
- 使用檔案描述符恢復誤刪除的資料檔案
- DELPHI實現關閉指定程式,自身防殺
- Linux檔案描述符Linux
- vc++實現檔案關聯C++
- FileUpload上傳多檔案時出現“無法訪問已關閉的檔案”錯誤的解決方法
- js實現使用檔案流下載csv檔案JS
- 實現關閉程式函式,殺掉pchunter函式
- 檔案描述符、開啟檔案表以及inode
- Linux下檔案描述符Linux
- 檔案控制程式碼、檔案描述符與程式和多執行緒的那些事執行緒
- 關於node實現檔案上傳
- 檔案包含之包含了Linux檔案描述符Linux
- linux系統程式設計之檔案與IO(八):檔案描述符相關操作-dup,dup2,fcntlLinux程式設計
- 02 使用配置檔案+反射實現反射
- 使用Servlet實現檔案下載Servlet
- 使用screen讓關閉ssh連線時不關閉程式
- windows 檔案描述符 _open_osfhandleWindows
- linux中的檔案描述符Linux
- Android 實現無網路傳輸檔案Android
- linux系統程式設計之檔案與IO(一):檔案描述符、open,closeLinux程式設計
- 關於solairs10的檔案描述符問題及設定AI
- win10系統關閉“最近使用的檔案”功能的方法Win10
- 因歸檔日誌無法歸檔造成的 oracle shutdown immediate無法關閉Oracle
- Python檔案關閉機制詳解Python
- powershell 關閉遠端開啟的檔案
- PHP 實現平滑關閉/重啟PHP
- Java程式碼實現下載檔案Java
- java程式實現刪除本地檔案Java
- 使用Spring實現上傳檔案Spring
- 使用dompdf/dompdf實現生成pdf檔案
- linux的I/O重定向和管道的檔案描述符運用,及shell如何實現多執行緒?Linux執行緒