使用FD_CLOEXEC實現close-on-exec,關閉子進程無用文件描述符

我們經常會碰到需要fork子進程的情況,而且子進程很可能會繼續exec新的程序。這就不得不提到子進程中無用文件描述符的問題!

fork函數的使用本不是這里討論的話題,但必須提一下的是:子進程以寫時復制(COW,Copy-On-Write)方式獲得父進程的數據空間、堆和棧副本,這其中也包括文件描述符。剛剛fork成功時,父子進程中相同的文件描述符指向系統文件表中的同一項(這也意味著他們共享同一文件偏移量)。
在這里插入圖片描述
接著,一般我們會調用exec執行另一個程序,此時會用全新的程序替換子進程的正文,數據,堆和棧等。此時保存文件描述符的變量當然也不存在了,我們就無法關閉無用的文件描述符了。所以通常我們會fork子進程后在子進程中直接執行close關掉無用的文件描述符,然后再執行exec。

但是在復雜系統中,有時我們fork子進程時已經不知道打開了多少個文件描述符(包括socket句柄等),這此時進行逐一清理確實有很大難度。我們期望的是能在fork子進程前打開某個文件句柄時就指定好:“這個句柄我在fork子進程后執行exec時就關閉”。其實時有這樣的方法的:即所謂的 close-on-exec。

close-on-exec的實現只需要調用系統的fcntl就能實現,很簡單幾句代碼就能實現:

 int fd=open("foo.txt",O_RDONLY);int flags = fcntl(fd, F_GETFD);flags |= FD_CLOEXEC;fcntl(fd, F_SETFD, flags);

這樣,當fork子進程后,仍然可以使用fd。但執行exec后系統就會字段關閉子進程中的fd了。

-------------------------------------------------------- 分割線 ------------------------------------------------------------------------------------

最近好好看了一下open函數,其中flags參數可以傳入O_CLOEXEC標記 [注意:linux 2.6.23才開始支持此標記]

這樣就可以一步實現上面的提到的close-on-exec的效果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378888.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378888.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378888.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql_result 對應mysqli哪個_php – 如何在mysqli中轉換mysql_result?

這個代碼以前是在mysql中,現在因為它已被棄用,我決定在mysqli中轉換我的代碼,但是我在我的頁面中有這個問題有分頁,在它使用mysql之前沒有錯誤,但現在我得到了這一行出錯:Warning: mysqli_fetch_assoc() expects exactly 1 parameter, 2 given錯誤是顯而易見的,我知…

Anaconda中下載速度賊慢?

清華鏡像 大致步驟如下: 1,windsR輸入cmd,打開命令終端頁面 輸入conda config --set show_channel_urls yes 2,在相應的C盤目錄下會生成.condarc文件 3,用記事本或者notepad打開進行替換 channels:- defaults show_c…

Delphi面向對象學習隨筆八:物理封裝

作者:巴哈姆特http://www.cnpack.org(轉載請注明出去并保持完整)前面說過的封裝其實是邏輯意義上的封裝。邏輯封裝是對某一特定邏輯功能模塊的封裝,這個特定邏輯功能塊可以是一個類,當然也可以是一個包,他們…

java 方法 示例_Java掃描器具有示例的NextNextShort()方法

java 方法 示例掃描器類的hasNextShort()方法 (Scanner Class hasNextShort() method) Syntax: 句法: public boolean hasNextShort();public boolean hasNextShort(int rad);hasNextShort() method is available in java.util package. hasNextShort()方法在java.…

mysql創建表時出現1071_mysql 出現1071錯誤怎么辦

mysql 出現1071錯誤的解決辦法:該問題是由鍵值字段長度過長導致。mysql支持數據庫表單一鍵值的最大長度不能超過767字節,超出這個長度即報錯(見標題名稱)。一般情況下,不會有鍵值字段的長度會超出該長度。但是需要注意的是,隨著全…

srs rtmp從監聽到接收到新連接的過程分析

:分析srs從啟動開始的main入口開始。分析rtmp監聽端口,然后到接收到新rtmp連接的過程分析。 目錄一、流程圖二、代碼分析1、srs_main_server.cpp:main()2、srs_main_server.cpp:do_main()3、srs_main_server.cpp:run()4、srs_main_server.cpp:run_master…

OpenCV筆記(基于Python)

學習時,將每塊注釋分別去掉即為一個模塊知識點 圖像數字化 import numpy as np """ #二維的ndarry #兩行四列全是0的uchar類型的二維數組 z np.zeros((2,4),np.uint8) print(type(z)) print(z) print("\n")#兩行四列全是1的整型矩陣 o …

POJ 1222 1681 1830 3185 開關燈問題 (高斯消元 異或方程組)

POJ 1222 EXTENDED LIGHTS OUT 基本的開關燈問題.還保證唯一解. 我們把每一個燈泡當成一個狀態xi,總共有30個,而且每個燈與其他燈的關系也很明顯。所以我們就可以列30方程30個變元的方程組: xi 1 * xi 1 * x(i-1) 1 * x(i1) 1 * x(i-6) …

我看周馬,以及3Q大戰背后的社會問題

如今鬧得不可開交的3Q大戰已經成了一道獨特的風景線,讓我們在茶余飯后又增添了不少談資。這兩個中國最大的客戶端軟件提供商各有擁躉無數,雙方鉚足了勁相互吐口水、扔磚頭,現在貌似到了動刀子了。周、馬在媒體上也都將自己標榜為“美貌與智慧…

Java PushbackReader ready()方法與示例

PushbackReader類ready()方法 (PushbackReader Class ready() method) ready() method is available in java.io package. ready()方法在java.io包中可用。 ready() method is used to check whether this stream is ready to be read or not. ready()方法用于檢查此流是否已準…

mysql數據庫知識點梳理_MySQL數據庫知識點整理 (持續更新中)

一、修改用戶密碼格式(在命令行下輸入):mysqladmin -u 用戶名 -p舊密碼 password 新密碼1. 給root添加密碼ab12: mysqladmin -uroot -password ab122. 將root的密碼修改為djg345: mysqladmin -uroot -pab12 password djg345二、添加新用戶格式:grant…

加載一張照片,可選擇是否另存為

加載一張照片,按下S鍵保存,ESC退出 加載一個灰度圖(E:\Python-workspace\yanyu.png),顯示圖片按下’s’鍵保存(beyond.png)(保存后的路徑和該程序所在路徑一致)后退出,或者按下 ESC 鍵退出不保存 import cv2img cv2.imread(E:\…

RTMP代理的協議規范(RtmpProxy)

RtmpProxy 關于RTMP代理的協議規范。RTMP是字節協議,第一個包是c0,1個字節,一般是03表示是明文的RTMP。所以如果需要做RTMP代理,如果直接轉發RTMP客戶端的消息,是沒法傳遞額外的信息的,譬如HTTP代理在Head…

經典地址收集

http://kuler.adobe.com/ 配色網站轉載于:https://www.cnblogs.com/Wolves/archive/2010/11/08/1871914.html

Java Math類toDegrees()方法與示例

數學類toDegrees()方法 (Math class toDegrees() method) toDegrees() method is available in java.lang package. toDegrees()方法在java.lang包中可用。 toDegrees() method is used to convert an angle from radians to degrees. toDegrees()方法用于將角度從弧度轉換為度…

談談Hybird3D中的光柵化優化

看到空明流轉分享了他的SALVIA 0.5.2優化談,我也來說說Hybird3D中和光柵化相關的一些優化技術。 Hybird3D的設計目標是打造一款準實時的軟件高質量渲染器,采用了光柵化和光線跟蹤混合算法,光柵化用于渲染eye ray,光線跟蹤則用于陰…

RTP協議基本分析(RTSP、WebRTC使用)

目錄1、介紹2、RTP3、格式4、RTP打包H2644.1、H264打包方式之Single NAL Unit4.2、H264打包方式之FU-A4.2.1、FU indication4.2.2、FU header4.2.3、第一個IDR幀的NALU第一個切片4.2.4、第一個IDR幀的NALU第二個切片4.2.5、第一個IDR幀的NALU最后一個切片5、RTP打包AAC5.1、AU-…

對照片進行邊緣化處理,并將邊緣化處理后的結果保存

對照片進行邊緣化處理,并將邊緣化處理后的結果保存 import cv2 from matplotlib import pyplot as plt img cv2.imread(E:\Python-workspace\OpenCV\OpenCV/water1.png,1)#第一個參數為選擇照片的路徑,注意照片路徑最后一個為正斜杠其他都為反斜杠&…

小皇帝,籃球,熱火

失敗,又一次,完全預料之中. 熱火的防守早已是千瘡百孔,熱火的攻擊也是亂無頭緒. 現在的熱火,需要詹姆斯無球的跑動,需要韋德的助攻。 轉載于:https://www.cnblogs.com/JeffChen/archive/2010/11/12/2600335.html

fastjson轉換時有大括號或者冒號或者有中括號_[Python Basic] 字符串處理以及類型轉換 1...

String Manipulation & Typecasting (1)1. 文本復制以及連接1.1 Multiply sign使用 multiply sigh/乘號* 來復制文本片段。乘號復制文本舉例: print("Hi" * 3) # output: HiHiHi print("*" * 10)# output:**********1.2 連接1.2.1 使用 plu…