1. 程式人生 > >子程序關閉從父程序繼承來的檔案描述符

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

前一陣子遇到了這麼一個問題,父程序建立了子程序,然後父程序退出。
子程序第一件事解除安裝sdcard,結果提示裝置資源忙。在子程序中使用fuser命令查
看sdcard掛載目錄,結果發現子程序的確佔用了該目錄, 馬上就明白了是子程序繼承了父
程序的檔案描述符。同時我聯想到一些開發不嚴謹的程式也經常出現忘記關閉檔案
描述符的問題。子程序如何關閉父程序的檔案描述符呢?這裡提供兩種方法供參考:
方法一:
    參考守護程序的做法
    #include "sys/resource.h"
    
    struct rlimit    rl;
    
    if(getrlimit(RLIMIT_NOFILE, &rl) < 0)
  {
      perror("getrlimit(RLIMIT_NOFILE, &rl)");
      return -1;
  }
    if(rl.rlim_max == RLIM_INFINITY)
    {
        rl.rlim_max = 1024;
    }
    for(i = 0; i < rlim_max; i++)
    {
        close(i);
    }
    其中關於getrlimit函式的相關介紹參考:
http://blog.csdn.net/likun_tech/article/details/7584234

    
方法二:
    簡單的談一下思維:在/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程序佔用的檔案描述符。

相關推薦

程序關閉程序繼承檔案描述

前一陣子遇到了這麼一個問題,父程序建立了子程序,然後父程序退出。 子程序第一件事解除安裝sdcard,結果提示裝置資源忙。在子程序中使用fuser命令查 看sdcard掛載目錄,結果發現子程序的確佔用了該目錄, 馬上就明白了是子程序繼承了父 程序的檔案描述符。同時我聯想到一

linux 如何設定程序所能開啟的最大檔案描述個數

當某個程式開啟檔案時,作業系統返回相應的檔案描述符,程式為了處理該檔案必須引用此描述符。所謂的檔案描述符是一個低階的正整數。最前面的三個檔案描述符(0,1,2)分別與標準輸入(stdin),標準輸出(stdout)和標準錯誤(stderr)對應。因此,函式 scanf() 使用 stdin,而函式 pri

Linux程序繼承程序檔案描述

/* tcp_server.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/type

fork -- 程序共享程序開啟的檔案描述

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #define FILE_PATH "file_point" int main(int a

OTP的supervisor tree如何保證程序一定隨程序的退出而退出

利用OTP行為包構建的應用之所以可靠,是因為我們按照OTP的設計模式,將所有程序組織成了一棵可靠的supervisor tree。每一個supervisor監控其子程序,並在其子程序出錯時按照重啟策略進行相應的處理。 但是,你是否考慮過,如果supervisor意外終止

linux C : 程序監聽程序使用的socket埠問題

前言 在cm中,有個服務程式,收到socket命令後,啟動一個子程序。 即使子程序沒有任何socket操作,用lsof -i :port 來檢視,也會看到子程序在監聽父程序開的socket埠。 如果父程序由於某種原因退出了(假設是崩潰,除錯或收到了

使用FD_CLOEXEC實現close-on-exec,關閉程序無用檔案描述

通過fcntl設定FD_CLOEXEC標誌有什麼用?    close on exec, not on-fork, 意為如果對描述符設定了FD_CLOEXEC,使用execl執行的程式裡,此描述符被關閉,不能再使用它,但是在使用fork呼叫的子程序中,此描述符並不關閉,仍可使用。   通過fcntl設定F

JAVA學習筆記 物件的上轉型物件(類物件當作類物件使用)

  世界萬物無非就是吃喝玩樂繁衍生息,傳宗接代是重中之重,這樣長久以來就構成了我們地球上的生態系統,java也是這樣,只不過這裡面更加直接和純粹,就用學生和人類做一下例子,學生一定是人類對吧?(苗紅根正的當代優秀青年不相信怪力亂神)所以說人類一定就是學生的父類,學生就是人類的子類。大圓之中

epoll在多程序下產生的“驚群”現象——如何避免——多程序因為檔案描述繼承問題導致

【遇到問題】     手頭原來有一個單程序的linux epoll伺服器程式,近來希望將它改寫成多程序版本,主要原因有: 在服務高峰期間 併發的 網路請求非常海量,目前的單程序版本的程式有點吃不消:單程序時只有一個迴圈先後處理epoll_wait()到的事件,使得某些不幸排隊靠後的socket fd的網路

C/C++: linux下獲取程序ID,程序ID

#include <iostream> #include <sys/types.h> #include <unistd.h> #include <stdio.

Linux核心模組程式設計(列出系統中所有核心執行緒的程式名、PID 號、程序狀態及程序優先順序、程序的PID)

(1) 設計一個模組,要求列出系統中所有核心執行緒的程式名、PID 號、程序狀態及程序優先順序、父程序的PID。 1.首先,我們開始編寫模組程式碼,這是Linux核心程式設計的核心程式碼,程式碼如下: #include <linux/init.h&

mui頁面關閉重新整理頁面資料例項

父頁面程式碼window.addEventListener('refresh', function(e) {          location.reload();      }) 子頁面程式碼mui.init({      beforeback: function() {

asp.net 頁面關閉重新整理頁面

當子頁面是用window.open開啟的時候可以以使用該方法,其他方法開啟的視窗還需測試 子頁面關閉按鈕事件。。。一般情況下 。。。彈出的視窗都有儲存按鈕 和取消按鈕。。取消直接關閉就行 不需要重新整理父頁面 儲存則需要 在儲存的onclick事件裡面寫這個就能刷星父頁面

解決“頁面關閉重新整理頁面區域性”問題的歷程

我在百度和必應裡面搜一下,很多解決方案是用window.showModalDialog來實現的,因為它有返回值,可以根據返回值來實現。但是chrome37以後就不支援window.showModalDialog,考慮相容性,就不能使用window.showModalDial

android程序間傳遞檔案描述原理

在linux中,程序開啟一個檔案,返回一個整數的檔案描述符,然後就可以在這個檔案描述符上對該檔案進行操作。那麼檔案描述符和檔案到底是什麼關係?程序使用的是虛擬地址,不同程序間是地址隔離的,如何在兩個程序中傳遞檔案描述符,然後指向同一檔案(binder傳遞檔案描述符)? li

Linux高效能伺服器程式設計——程序間 傳遞檔案描述

問題的提出   一:fork()之後,父程序中開啟的檔案描述符,在子程序中仍然處於開啟狀態。所以從父程序——》子程序(傳遞檔案描述符)很方便。值得注意的是傳遞一個檔案描述符並不是傳遞一個檔案描述符的值。   二:那麼怎樣吧子程序中開啟的檔案描述符傳遞給父程序呢?通俗的說:

linux 程序檔案 檔案描述

簡單歸納:fd只是一個整數,在open時產生。起到一個索引的作用,程序通過PCB中的檔案描述符表找到該fd所指向的檔案指標filp。 檔案描述符的操作(如: open)返回的是一個檔案描述符,核心會在每個程序空間中維護一個檔案描述符表, 所有開啟的檔案都將通過此表中的檔案描述符來引用; 而流(如: fop

程式中建立一個子程序,然後父子程序各自獨自執行,程序在標準輸入裝置上讀入小寫字母,寫入管道。程序管道讀取字元並轉化為大寫字母。讀到x結束

程式中建立一個子程序,然後父子程序各自獨自執行,父程序在標準輸入裝置上讀入小寫字母,寫入管道。子程序從管道讀取字元並轉化為大寫字母。讀到x結束。(非字母字元就輸出本身) 相關的系統函式:fork(),read(),write(),pipe(); 筆者在telnet上寫這些程式碼,由於

通過父子程序完成檔案io對檔案的拷貝,程序檔案開始到檔案 的一半開始拷貝,程序檔案的一半到檔案末尾。

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #inclu

對於多程序程序繼承程序的內容

子程序繼承父程序 使用者號UIDs和使用者組號GIDs環境Environment堆疊共享記憶體開啟檔案的描述符執行時關閉(Close-on-exec)標誌訊號(Signal)控制設定程序組號當前工作目