子程序關閉從父程序繼承來的檔案描述符
子程序第一件事解除安裝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函式的相關介紹參考:
方法二:
簡單的談一下思維:在/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)控制設定程序組號當前工作目