前一陣子遇到了這麼乙個問題,父程序建立了子程序,然後父程序退出。
子程序第一件事解除安裝sdcard,結果提示裝置資源忙。在子程序中使用fuser命令查
看sdcard掛載目錄,結果發現子程序的確占用了該目錄, 馬上就明白了是子程序繼承了父
程序的檔案描述符。同時我聯想到一些開發不嚴謹的程式也經常出現忘記關閉檔案
描述符的問題。子程序如何關閉父程序的檔案描述符呢?這裡提供兩種方法供參考:
方法一:
參考守護程序的做法
#include "sys/resource.h"
struct rlimit rl;
if(getrlimit(rlimit_nofile, &rl) < 0)
if(rl.rlim_max == rlim_infinity)
for(i = 0; i < rlim_max; i++)
方法二:
簡單的談一下思維:在/proc/pid/fd目錄下記載了該程序所開啟的所用檔案描述符。
可以使用遍歷該目錄的形式,呼叫close(fd)關閉檔案描述符。例如:
# pwd
/proc/623/fd
# ls
0 12 16 2 23 27 30 35 39 42 46 5 53 57 60 64 68 8
1 13 17 20 24 28 32 36 4 43 47 50 54 58 61 65 69 9
10 14 18 21 25 29 33 37 40 44 48 51 55 59 62 66 7
11 15 19 22 26 3 34 38 41 45 49 52 56 6 63 67 70
# 表示623程序占用的檔案描述符。
Bash 會清空從父程序繼承來的 OLDPWD
即便 bash 沒有從父程序繼承任何的環境變數,bash 自己也會建立三個環境變數,分別是 env i bash c export declare x oldpwd declare x pwd declare x shlvl 1 如果父程序傳遞了 shlvl 環境變數,那麼 bash 會在那個值的基...
fork 子程序不繼承父程序開啟的檔案描述符
昨天面試被問到了這個問題,沒有回答上來,網上找了一下答案。解決方法是使用clone系統呼叫使用引數在複製時將父程序資源有選擇地複製給子程序。下面介紹forkvforkclone三者的區別 vfork系統呼叫不同於fork,用vfork建立的子程序與父程序共享位址空間,也就是說子程序完全執行在父程序的...
Linux子程序繼承父程序的檔案描述符
include include include include include include include int main pid t pid int ret 0 int fd open temp.txt o creat o trunc o rdwr,0666 if fd 1 if pid f...