日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符

發布時間:2023/12/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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的效果。

總結

以上是生活随笔為你收集整理的使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。