子程序關閉從父程序繼承來的檔案描述符

2021-06-27 08:48:40 字數 918 閱讀 8417

前一陣子遇到了這麼乙個問題,父程序建立了子程序,然後父程序退出。

子程序第一件事解除安裝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...