最大值是系統相關的,linux shell 輸入如下命令就知道,其中的「-n: file descriptors」就是最大限制值。
# ulimit -a
-f: file size (blocks) unlimited
-t: cpu time (seconds) unlimited
-d: data seg size (kb) unlimited
-s: stack size (kb) 8192
-c: core file size (blocks) 0
-m: resident set size (kb) unlimited
-l: locked memory (kb) 64
-p: processes 128
-n: file descriptors 1024
-v: address space (kb) unlimited
-w: locks unlimited
-e: scheling priority 0
-r: real-time priority 0
㈡ linux ">" ">>" "<" "<<"什麼意思
輸出/輸入重導向
> >> < << :> &> 2&> 2<>>& >&2
文件描述符(File Descriptor),用一個數字(通常為0-9)來表示一個文件。
常用的文件描述符如下:
文件描述符 名稱 常用縮寫 默認值
0 標准輸入 stdin 鍵盤
1 標准輸出 stdout 屏幕
2 標准錯誤輸出 stderr 屏幕
我們在簡單地用<或>時,相當於使用 0< 或 1>(下面會詳細介紹)。
* cmd > file
把cmd命令的輸出重定向到文件file中。如果file已經存在,則清空原有文件,使用bash的noclobber選項可以防止復蓋原有文件。
* cmd >> file
把cmd命令的輸出重定向到文件file中,如果file已經存在,則把信息加在原有文件後面。
* cmd < file
使cmd命令從file讀入
* cmd << text
從命令行讀取輸入,直到一個與text相同的行結束。除非使用引號把輸入括起來,此模式將對輸入內容進行shell變數替換。如果使用<<- ,則會忽略接下來輸入行首的tab,結束行也可以是一堆tab再加上一個與text相同的內容,可以參考後面的例子。
* cmd <<< word
把word(而不是文件word)和後面的換行作為輸入提供給cmd。
* cmd <> file
以讀寫模式把文件file重定向到輸入,文件file不會被破壞。僅當應用程序利用了這一特性時,它才是有意義的。
* cmd >| file
功能同>,但即便在設置了noclobber時也會復蓋file文件,注意用的是|而非一些書中說的!,目前僅在csh中仍沿用>!實現這一功能。
: > filename 把文件"filename"截斷為0長度.# 如果文件不存在, 那麼就創建一個0長度的文件(與'touch'的效果相同).
cmd >&n把輸出送到文件描述符n
cmd m>&n 把輸出 到文件符m的信息重定向到文件描述符n
cmd >&-關閉標准輸出
cmd <&n 輸入來自文件描述符n
cmd m<&n m來自文件描述各個n
cmd <&-關閉標准輸入
cmd <&n-移動輸入文件描述符n而非復制它。(需要解釋)
cmd >&n-移動輸出文件描述符 n而非復制它。(需要解釋)
注意: >&實際上復制了文件描述符,這使得cmd > file 2>&1與cmd 2>&1 >file的效果不一樣。更多Linux知識可參考《Linux就該這么學》。
㈢ linux文件描述符
Linux 下,一切皆文件
在Linux操作系統中,可以將一切都看作是文件,包括普通文件,目錄文件,字元設備文件(如鍵盤,滑鼠…),塊設備文件(如硬碟,光碟機…),套接字等等,所有一切均抽象成文件,提供了統一的介面,方便應用程序調用。
既然在Linux操作系統中,你將一切都抽象為了文件,那麼對於一個打開的文件,我應用程序怎麼對應上呢?
文件描述符應運而生。
文件描述符:File descriptor,簡稱fd,當應用程序請求內核打開/新建一個文件時,內核會返回一個文件描述符用於對應這個打開/新建的文件,其fd本質上就是一個 非負整數 。實際上,它是一個索引值,指向 內核為每一個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者創建一個新文件時,內核向進程返回一個文件描述符。 在程序設計中,一些涉及底層的程序編寫往往會圍繞著文件描述符展開。但是文件描述符這一概念往往只適用於UNIX、Linux這樣的操作系統。
操作系統的核心叫內核,是一個獨立的軟體。
操作系統為每一個進程維護了一個文件描述符表,該表的索引值都從從0開始的,所以在不同的進程中可以看到相同的文件描述符,這種情況下相同的文件描述符可能指向同一個文件,也可能指向不同的文件,具體情況需要具體分析,下面用一張簡圖就可以很容易的明白了。
通過上圖可以看到,當不同進程中出現相同的文件描述符時,可能實際對應的文件並不是同一個,相反不同進程中不同的文件描述符也可可能對應同一個文件。
當一個應用程序剛剛啟動的時候,0是標准輸入,1是標准輸出,2是標准錯誤。如果此時去打開一個新的文件,它的文件描述符會是3。POSIX標准要求每次打開文件時(含socket)必須使用當前進程中最小可用的文件描述符號。
文件描述符是一個重要的系統資源,理論上系統內存多大就應該可以打開多少個文件描述符,但是實際情況是,內核會有系統級限制,以及用戶級限制(不讓某一個應用程序進程消耗掉所有的文件資源,可以使用ulimit -n 查看)。
進程 + 文件描述符ID確認,因為內核為每個進程都有一份其所屬的文件描述符表。
所以linux下兩個進程返回的文件描述符是不一樣的
多個進程之間的fd:
應用程序進程拿到的 文件描述符ID 對應 進程文件描述符表 的索引,通過索引拿到 文件指針 ,指向系統級文件描述符表的 文件偏移量 ,再通過文件偏移量找到 inode指針 ,最終對應到真實的文件。
㈣ linux ls中【^1】的含義
這個符號在規則表達式中,代錶行的 "開頭" 位置,在[]中也與"!"(嘆號)一樣表示「非」
輸出/輸入重導向。
文件描述符(File Descriptor),用一個數字(通常為0-9)來表示一個文件。
常用的文件描述符如下:
文件描述符 名稱 常用縮寫 默認值
0 標准輸入 stdin 鍵盤
1 標准輸出 stdout 屏幕
2 標准錯誤輸出 stderr 屏幕
我們在簡單地用<或>時,相當於使用 0< 或 1>(下面會詳細介紹)。
㈤ 如何在 Linux 下調整可打開文件/文件描述符數目
進程最大打開文件描述符數:user limit中nofile的soft limita. 查看
$ ulimit -n
1700000
2. 設置
a. 臨時性:通過ulimit -Sn設置最大打開文件描述符數的soft limit,注意soft limit不能大於hard limit(ulimit -Hn可查看hard limit),另外ulimit -n默認查看的是soft limit,但是ulimit -n 1800000則是同時設置soft limit和hard limit。對於非root用戶只能設置比原來小的hard limit。
查看hard limit:
$ ulimit -Hn
1700000
設置soft limit,必須小於hard limit:
$ ulimit -Sn 1600000
2. 永久性:上面的方法只是臨時性的,注銷重新登錄就失效了,而且不能增大hard limit,只能在hard limit范圍內修改soft limit。若要使修改永久有效,則需要在/etc/security/limits.conf中進行設置(需要root許可權),可添加如下兩行,表示用戶chanon最大打開文件描述符數的soft limit為1800000,hard limit為2000000。以下設置需要注銷之後重新登錄才能生效:
chanon soft nofile 1800000
chanon hard nofile 2000000
設置nofile的hard limit還有一點要注意的就是hard limit不能大於/proc/sys/fs/nr_open,假如hard limit大於nr_open,注銷後無法正常登錄。可以修改nr_open的值:
# echo 2000000 > /proc/sys/fs/nr_open
㈥ 【fd】Linux文件描述符
在Linux下一切資源皆文件,普通文件是文件,磁碟列印機是文件,socket 當然也是文件。
關於Linux下系統,進程能最大能打開的文件描述符數看過好多文章,但大都沒有完整,詳細說明每個值表示什麼意思,在實踐中該怎麼設置?
如何通過最簡單的設置來實現最有效的性能調優,如何在有限資源的條件下保證程序的運作?
max-file 表示系統級別的能夠打開的文件句柄的數量,是對整個系統的限制,並不是針對用戶的。
ulimit -n 控制進程級別能夠打開的文件句柄的數量,提供對shell及其啟動的進程的可用文件句柄的控制,這是進程級別的。
對於伺服器來說,file-max和ulimit都需要設置,否則會出現文件描述符耗盡的問題。
一般如果遇到文件句柄達到上限時,會碰到"Too many open files"或者Socket/File: Can』t open so many files等錯誤。
相關的3個文件:
/proc/sys/fs/file-max
/proc/sys/fs/file-nr
/etc/security/limits.conf
/proc/sys/fs/file-max
Linux系統級別限制所有用戶進程能打開的文件描述符總數。
max-file 表示系統級別的能夠打開的文件句柄的數量,是對整個系統的限制,並不是針對用戶的。
/etc/security/limits.conf
用戶級別的限制是通過可以通過命令ulimit命令和文件/etc/security/limits.conf
/proc/sys/fs/file-nr 該參數是只讀的,不能修改。
file-nr的值由3部分組成:
1,已經分配的文件描述符數;
2,已經分配但未使用的文件描述符數;
3,內核最大能分配的文件描述符數
/proc/${pid}/fd
眾所周知,在相應進程的/proc/$pid/fd 目錄下存放了此進程所有打開的fd。
當然有些可能不是本進程自己打開的,如通過fork()從父進程繼承而來的。
那麼這個socket:後面的一串數字是什麼呢?其實是該socket的inode號。
那麼,知道了某個進程打開的socket的inode號後,我們可以做什麼呢?
這就涉及到/proc/net/tcp(udp對應/proc/net/udp)文件了,其中也列出了相應socket的inode號通過比對此欄位,我們能在/proc/net/tcp下獲得此套介面的其他信息,如對應的<本地地址:埠號,遠端地址:埠號>對,窗口大小,狀態等信息。
具體欄位含義詳見net/ipv4/tcp_ipv4.c 中的 tcp4_seq_show 函數。
如果socket創建了,沒有被使用,那麼就只會在/proc/pid/fd下面有,而不會在/proc/net/下面有相關數據。
目錄中的每一項都是一個符號鏈接,指向打開的文件,數字則代表文件描述符。
其中0 = /dev/null ,1 = stdout, 2 = stderr,用cat或tail查看即可。
Number of file descriptors: different between /proc/sys/fs/file-nr and /proc/$pid/fd?
https://serverfault.com/questions/485262/number-of-file-descriptors-different-between-proc-sys-fs-file-nr-and-proc-pi
Linux中最大文件描述符數
https://leokongwq.github.io/2016/11/09/linux-max-fd.html
How do linux file descriptor limits work?
https://stackoverflow.com/questions/3991223/how-do-linux-file-descriptor-limits-work
limits.conf(5) - Linux man page
https://linux.die.net/man/5/limits.conf
Why can't I tail -f /proc/$pid/fd/1 ?
https://unix.stackexchange.com/questions/152773/why-cant-i-tail-f-proc-pid-fd-1
Linux查看進程運行輸出(/proc/<pid>/fd)
https://blog.csdn.net/u014756245/article/details/120023188
㈦ 文件描述符是什麼
問題一:文件描述符和文件指針的區別 文件描述符:在linux系統中打開文件就會獲得文件描述符,它是個很小的正整數。每個進程在PCB(Process Control Block)中保存著一份文件描述符表,文件描述符就是這個表的索引,每個表項都有一個指向已打開文件的指針。
文件指針:C語言中使用文件指針做為I/O的句柄。文件指針指向進程用戶區中的一個被稱為FILE結構的數據結構。FILE結構包括一個緩沖區和一個文件描述符。而文件描述符是文件描述符表的一個索引,因此從某種意義上說文件指針就是句柄的句柄(在Windows系統上,文件描述符被稱作文件句柄)。
問題二:誰能解釋一下文件描述符標志? 文件描述符非負整數打現存文件或新建文件內核返文件描述符讀寫文件需要使用文件描述符指定待讀寫文件 習慣標准輸入(standard input)文件描述符 0標准輸(standard output) 1標准錯誤(standard error) 2盡管種習慣並非 Unix 內核特性些 shell 應用程序都使用種習慣內核遵循種習慣應用程序能使用 POSIX 定義 STDIN_FILENO、STDOUT_FILENO STDERR_FILENO 代替 0、1、2三符號量定義位於文件 unistd.h 文件描述符效范圍 0 OPEN_MAX般說每進程打 64 文件(0 ― 63)於 FreeBSD 5.2.1、Mac OS X 10.3 Solaris 9 說每進程打文件少取決於系統內存int 及系統管理員設定限制
問題三:文件描述符的定義數量 如何在不同平台上定義文件描述符的數量文件描述符極限以及可分配給進程的最大大小由資源限制來定義。這些值應當按照在WebLogicServer文檔中建議的、特定於操作系統的文件描述符值來設置:對於WLS8.1:調整硬體、操作系統和網路性能對於WLS7.0:調整硬體、操作系統和網路性能對於WLS6.1:調整硬體、操作系統和網路性能Unix和Linux都有文件描述符。不過,二者的主要區別在於如何設置文件描述符的硬極限值、預設值和配置過程。Solaris/usr/bin/ulimit實用程序定義允許單個進程使用的文件描述符的數量。它的最大值在rlim_fd_max中定義,在預設情況下,它設置為65,536。只有root用戶才能修改這些內核值。Linux管理用戶可以在etc/security/limits.conf配置文件中設置他們的文件描述符極限,如下例所示。softnofile1024hardnofile4096系統級文件描述符極限還可以通過將以下三行添加到/etc/rc.d/rc.local啟動腳本中來設置:#Increasesystem-widefiledescriptorlimit.echo4096>/proc/sys/fs/file-maxecho16384>/proc/sys/fs/inode-maxWindows在Windows操作系統上,文件描述符被稱作文件句柄。在Windows2000伺服器上,打開文件的句柄極限設置為16,384。此數量可以在任務管理器的性能摘要中監視。HP-UXnfile定義打開文件的最大數量。此值通常由以下公式來確定:((NPROC*2)+1000),其中NPROC通常為:((MAXUSERS*5)+64)。如果MAXUSERS等於400,則經過計算得到此值為5128。通常可以將此值設高一些。maxfiles是每個進程的軟文件極限,maxfiles_lim是每個進程的硬文件極限。AIX文件描述符極限在/etc/security/limits文件中設置,它的預設值是2000。此極限可以通過ulimit命令或setrlimit子常式來更改。最大大小由OPEN_MAX常數來定義。
問題四:文件描述符可以是0嗎 文件描述符是一個簡單的整數,用以標明每一個被進程所打開的文件和socket。
第一個打開的文件是0,第二個是1,依此類推。Unix 操作系統通常給每個進程能打開的文件數量強加一個限制。更甚的是,unix 通常有一個系統級的限制。 os.chinauni
問題五:如何判斷文件描述符在fd open 一個文件將返回一個文件描述符。 0 - 返回的文件描述符 就是已經打開的。 /proc/pid/fd 下面為該進程打開的文件描述符 如果我的回答沒能幫助您,請繼續追問。
問題六:Linux查看進程打開多少文件描述符命令 linux系統下查看進程打開文件在/proc下,對應每個進程有一個以進程號命名的目錄,該目錄下有一個fd目錄,該目錄下面的每個文件是一個符號連接,其文件名對應該進程佔用的一個文件描述符,而連接指向的內容表示文件描述符對應的實際文件,有多少個文件描述符表示該進程打開了多少文件。
另外Linux
默認的進程打開文件上限是1024個,可以通過ulimit
-n查看。很多系統上限可以通過修改/etc/security/limits.conf文件改變,這個文件有詳細的注釋,對如何修改做了說明。如果希望
把所有用戶的進程打開文件上限改為65536,可以加入下面兩行
* soft nofile 65535
* hard nofile 65535
還可以只真對某個用戶或某個組做修改,具體方法參見文件注釋。修改後需要重新啟動系統才能生效。
問題七:linux 文件描述符 3是什麼?例如 0 1 2代表標準的輸出輸入和出錯,但是3,4又是什麼的呢? 其他已經被打開的文件
問題八:文件描述符掛起是什麼意思 具體操作,需要修改兩處,並且需重新啟動Linux伺服器。首先SSH登錄伺服器,執行ulimit-a查看當前限制。這一步是可選,主要是看下限制,心裡有數。第一處修改:vim/etc/security/limits.conf在文件尾部增加:*softnofile65535*hardno
問題九:有人了解java與linux文件描述符之間的關系嗎 linux文件描述符? 可以認為是linux下的任務管理中打開文件的索引表,是系統中使用的。。。。。。。java是一個平台、一種編程語言。。。。。。不知道要怎麼比較了。
問題十:文件描述符fb和tcp連接數有什麼關系 C10K的問題在上個世紀90年代就被提出來了。大概的意思是當用戶數超過1萬時,很多設計不良好的網路服務程序性能都將急劇下降、甚至癱瘓。並且,這個問題並不能通過升級硬體設備解決,是操作系統固有的問題,也就是說,如果你的伺服器最高能支撐1000個並發,盡管你升級了計算能力高一倍的 cpu,內存再翻一番,硬碟轉速在快一倍,也無法支撐2000個並發。
經典的網路編程模型有4個:
1. Serve one client with each thread/process, and use blocking I/O。即對每個客戶都使用不同的線程或進程進行服務,在每個線程或進程中使用阻塞I/O。這是小程序和java常用的策略,對於互動式的應用也是常見的選擇,這種策略很能難滿足高性能程序的需求,好處是實現極其簡單,容易實現復雜的交互邏輯。我們常用的Apache、ftpd等都是這種工作。
2. Serve many clients with single thread, and use nonblocking I/O and readiness notification。即對所有的客戶使用單一一個線程或進程進行服務,在這個線程或進程里,採用非同步IO的策略。這是經典模型,優點在於實現較簡單,方便移植,也能提供足夠的性能;缺點在於無法充分利用多CPU的資源。
3. Serve many clients with each thread, and use nonblocking I/O and readiness notification 對經典模型2的簡單改進,仍然採用非同步IO的策略,但對所有的客戶使用多個線程或進程進行服務。缺點是容易在多線程並發上出bug,甚至某些OS不支持多線程進行readiness notification
4. Serve many clients with each thread, and use asynchronous I/O 在有AI/O支持的OS上,能提供相當高的性能。不過AI/O編程模型和經典模型差別相當大,基本上很難寫出一個框架同時支持AI/O和經典模型。這個模型主要是用於window平台上。
㈧ linux 文件描述符最大是多少
人們常說linux最大有65536個文件描述符,是由於常用linux內核的默認值決定的,實際上是可以通過修改內核突破的。
了解下文件描述符,內核(kernel)利用文件描述符(file descriptor)來訪問文件。文件描述符是非負整數。打開現存文件或新建文件時,內核會返回一個文件描述符。讀寫文件也需要使用文件描述符來指定待讀寫的文件。
文件描述符的有效范圍是 0 到 OPEN_MAX。一般來說,每個進程最多可以打開 64 個文件(0 — 63)。對於 FreeBSD 5.2.1、Mac OS X 10.3 和 Solaris 9 來說,每個進程最多可以打開文件的多少取決於系統內存的大小,int 的大小,以及系統管理員設定的限制。Linux 2.4.22 強制規定最多不能超過 1,048,576 。