1. 程式人生 > >Linux程式設計--檔案描述符fd

Linux程式設計--檔案描述符fd

    linux中, 每一個程序在核心中,都對應有一個“開啟檔案”陣列,存放指向檔案物件的指標,而 fd 是這個陣列的下標

    我們對檔案進行操作時,系統呼叫,將fd傳入核心,核心通過fd找到檔案,對檔案進行操作。

    既然是陣列下標,fd的型別為int, < 0 為非法值, >=0 為合法值。在linux中,一個程序預設可以開啟的檔案數為1024個,fd的範圍為0~1023。可以通過設定,改變最大值。

    在linux中,值為0、1、2的fd,分別代表標準輸入、標準輸出、標準錯誤輸出。在上一篇文章中,使用重定向 2>/dev/null 就是把標準錯誤輸出重定向到位桶中去,不顯示出來。因為 0 1 2已經被linux使用了,通常在程式中開啟的fd,是從3開始的。但我們在判斷一個fd是否合法時,依然要使用>=0的判斷標準

    fd的分配原則,是從小到大,找到第一個不用的進行分配。

    除了open之外, socket程式設計的socket()/accept()等函式,也會返回一個fd值。

    1)Linux系統下,所有程序允許開啟的最大fd數量。查詢語句:

        /proc/sys/fs/file-max
    2)Linux系統下,所有程序已經開啟的fd數量及允許的最大數量。查詢語句:

        /proc/sys/fs/file-nr
    3)單個程序允許開啟的最大fd數量.查詢語句:

        ulimit -n
    4)單個程序(例如程序id為5454)已經開啟的fd.查詢語句:

        ls -l /proc/5454/fd/
 

相關推薦

Linux程式設計--檔案描述fd

    linux中, 每一個程序在核心中,都對應有一個“開啟檔案”陣列,存放指向檔案物件的指標,而 fd 是這個陣列的下標。     我們對檔案進行操作時,系統呼叫,將fd傳入核心,核心通過fd找到檔案,對檔案進行操作。     既然是陣列下標,fd的型別為int, &

linux檔案描述fd和struct file結構體的釋放

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

linux檔案描述fd檔案指標flip的理解

整理自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html簡單歸納:fd(file descriptor)只是一個整數,在open時產生。起到一個索引的作用。每個程序在PCB(Process Control

Linux中的檔案描述(fd)與開啟檔案之間的關係

1. 概述     在Linux系統中一切皆可以看成是檔案,檔案又可分為:普通檔案、目錄檔案、連結檔案和裝置檔案。檔案描述符(file descriptor)是核心為了高效管理已被開啟的檔案所建立的索引,其是一個非負整數(通常是小整數),用於指代被開啟的檔案,所有執行I/O操作的系統呼叫都通過檔案描

Linux檔案描述fd)與 檔案指標(FILE*)

一、檔案描述符(fd) 我們都知道在Linux下一切皆檔案。當然裝置也不例外,如果要對某個裝置進行操作,就不得不開啟此裝置檔案,開啟檔案就會獲得該檔案的檔案描述符fd( file discriptor), 它就是一個很小的整數,每個程序在PCB(Process

Linux基礎IO--檔案描述fd/重定向

在學習檔案描述符之前,我們先來看一點其它相關的知識點。我們都知道,對一個檔案我們可以進行開啟、讀、寫、關閉操作,在我們沒有接觸Linux之前,將資訊輸出到顯示器上,我們通常能想到的方法有以下幾種:#include<stdio.h> #include<stri

淺談 Linux 下的檔案描述 fd fp

檔案描述符: 是個很小的正整數,它是一個索引值,指向核心為每一個程序所維護的該程序開啟檔案的記錄表。 當某個程式開啟檔案時,作業系統返回相應的檔案描述符,程式為了處理該檔案必須引用此描述符。所謂的檔案描述符是一個低階的正整數。最前面的三個檔案描述符(0,1

linux檔案描述

寫在前面,linux的描述符有程序描述符、檔案描述符、記憶體描述符。首先標題想了很久linux的描述符從哪裡說起,看了幾份資料後還是決定從程序描述符說起。但是此文章還是重點說的是檔案描述符。知識深度有限,如有錯誤,請指出。 程序描述符:linux為了管理程序,核心必須對每個程序所作的事情進行清楚的描述,

Linux檔案描述fb和檔案指標FILE*的聯絡與區別

檔案描述符: linux中,當一個程序開啟一個檔案或者是建立一個新檔案時,核心向程序返回一個檔案描述符來標示該檔案。 檔案描述符是一個非負整數,實際上它是一個索引,指向核心為程序所維護的一個檔案記錄表。 任何程式執行起來都會開啟三個預設的流,標準輸入流,標準輸出流,標準錯誤流通

深入理解Linux/Unix檔案描述和epoll

Linux/Unix 檔案描述符(File Describer)的本質 Linux/Unix(以下簡稱Linux)系統中,每個程序都有一個專用的陣列,陣列的元素是一個結構體,稱為檔案描述符File Descriptor(以下簡稱fd),但是至少包含一個檔案指標,指向Linux核心的O

Python 標準輸入輸出stdin stdout stderr 對照c解讀 為理解Linux檔案描述fileno做鋪墊

參考連結 詳解stdin,stdout,stderr 作者: 茶鹽耙 How to print to stderr in Python 作者:stack overflow 標準輸入流:鍵盤、掃碼槍等輸入裝置輸入的東西。 標準輸出流:螢幕、檔案等接受的東西 緩衝區:記憶體? 檔

檔案描述fd檔案指標File* fp的區別和轉換

在linux系統中把裝置和普通檔案也都看做是檔案,要對檔案進行操作就必須先開啟檔案,開啟檔案後會得到一個檔案描述符,它是一個很小的正整數,是一個索引值。 核心會為每一個執行中的程序在程序控制塊pcb中維護一個開啟檔案的記錄表,每一個表項都有一個指標指

linux基礎-檔案描述

檔案描述符簡介 檔案描述符(file descriptor)通常是一個小的非負整數,核心用以標識一個特定程序正在訪問的檔案。當開啟一個現有檔案或建立一個新檔案時,核心向程序返回一個檔案描述符。 每個程序在PCB(Process Control Block)中儲

linux檔案描述集fd_set的實現方式

通過賦值語句可以在兩個檔案描述符集之間進行賦值,例如可以這樣寫: fd_set readset,tmpset; FD_ZERO(&readset); FD_ZERO(&tmpset); FD_SET(listener,&tmpset);

Linux檔案描述和開啟檔案之間的關係

2014-07-06 wcdj 檔案描述符和開啟的檔案之間似乎是一一對應的關係,但實際可以多個檔案描述符指向同一開啟檔案,這些檔案描述符可能在相同或不同的程序中開啟。核心維護的三個資料結構: (1) 程序級的檔案描述符表 (2) 系統級的開啟檔案表 (3) 檔案系統的i-

檔案描述fd檔案指標fp之間的相互轉換

      Linux/Unix下使用open函式(系統呼叫)開啟檔案會得到檔案描述符fd(int型變數),而使用C庫中的fopen函式開啟檔案則會得到檔案描述符fp(FILE*型變數),二者之間是可以相互轉換的,下面是兩個example。 1.fd轉換為fp int

linux系統檔案描述file descriptor與inode的相關知識

每個程序在Linux核心中都有一個task_struct結構體來維護程序相關的 資訊,稱為程序描述符(Process Descriptor),而在作業系統理論中稱為程序控制塊 (PCB,Process Control Block)。task_struct中有一個指標(

c++/c socket應用的區別:socket()函式返回檔案描述fd總是0的問題

最近在arm linux系統上面使用socket建立客戶端到伺服器的連線, 客戶端需要開2個socket連線2個不同的伺服器, 這兩個申請socket的過程都放在同一個類的成員函式中實現, 測試發現,每次拿到的socket的fd均為0。 這個id為0,雖然用起來沒有問題,但

Linux檔案描述剖析

Linux檔案IO open、dup、fork核心原理分析1、open一個檔案 一個Linux程序啟動後,會在核心空間建立一個PCB程序控制塊,PCB是一個程序的私有財產。 這個PCB中有一個已開啟檔案描述符表,記錄著所有該程序開啟的檔案描述符以及對應的file結構體地址。

linux檔案描述的種種限制

最近在研究linux伺服器下TCP的最大連線數問題,因為系統為每個TCP連線都要建立一個socket控制代碼,而每個socket控制代碼同時也是一個檔案控制代碼,所以就專門對linux下檔案描述符的種種限制作了一些深入的研究: 1,ulimit  -n 65556 ulim