linux描述符
Ⅰ linux可以創建一個「」虛擬文件描述符「么
文件描述符是一個簡單的整數,用以標明每一個被進程所打開的文件和socket。第一個打開的文件是0,第二個是1,依此類推。Unix操作系統通常給每個進程能打開的文件數量強加一個限制。更甚的是,unix通常有一個系統級的限制。在UNIX/Linux平台上,對於控制台(Console)的標准輸入(0),標准輸出(1),標准錯誤(2)輸出也對應了三個文件描述符。
對於squid,因為squid 的工作方式,文件描述符的限制可能會極大的影響性能。當squid 用完所有的文件描述符後,它不能接收用戶新的連接。也就是說,用完文件描述符導致拒絕服務。直到一部分當前請求完成,相應的文件和socket 被關閉,squid不能接收新請求。當squid發現文件描述符短缺時,它會發布警告。
對於Apache,當使用了很多虛擬主機,而每個主機又使用了不同的日誌文件時,Apache可能會遭遇耗盡文件描述符(有時也稱為file handles)的困境。 Apache使用的文件描述符總數如下:每個不同的錯誤日誌文件一個、 每個其他日誌文件指令一個、再加10~20個作為內部使用。Unix操作系統限制了每個進程可以使用的文件描述符數量。典型上限是64個,但可以進行擴充,直至到達一個很大的硬限制為止(a large hard-limit)。
Ⅱ linux下打開一個設備,文件描述符是怎麼分配 的
你好。0是標准輸入,1是標准輸出,2是標准錯誤。如果此時去打開一個新的文件,它的文件描述符會是3。POSIX標准要求每次打開文件時(含socket)必須使用當前進程中最小可用的文件描述符。
Ⅲ 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下的文件描述符是一個整型數,是對一個文件的標識,fopen打開一個文件就會返回一個相應的文件描述符
Ⅳ 如何在Linux下增大可打開文件描述符的數目
在安裝Oracle Grid Infrastructure檢查約束時遇到一個錯誤,大體是說當前可打開的文件描述符的最大數為1024,而要求是65536。
於是在gird用戶下執行ulimit -a,顯示可打開的最大文件數為1024,這是默認值;執行ulimit -n 65536不允許修改,轉到root下面執行ulimit -n 65536,執行ulimit -a 顯示為65536,在grid用戶下執行依然為1024。當時想到用sudo的方式執行,對gird用戶賦予所有許可權,執行ulimit -n 65536依然報錯。
後來想起在配置/etc/profile文件里,對oracle有ulimit -n 65536的命令,如下:
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
添加grid用戶後,source /etc/profile
if [ $USER = "oracle" ] || [ $USER = "grid" ] ; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
在grid執行ulimit -a依然為1024,後來檢查安裝步驟發現忘了在/etc/security/limits中添加grid用戶了,添加下面即可:
grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536
看來是作用域的問題,增大文件描述符。
Ⅵ linux 文件描述符最大是多少怎麼計算的
最大值是系統相關的,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用什麼標識,描述和控制文件
Linux的文件標識符,和Windows的就是文件名不同,它相當於文件的一個指針。在linux的c語言中,除了用通用的《【C】文件讀寫問題》(點擊打開鏈)中介紹過的fopen等c語言通用操作文件以外,其Linux應用請參考《【Linux】利用C語言文件流復制單一文件),還能用文件標識符還來操作文件。這也是Linux中C語言,最底層,最原始控制文件的方式,其函數open,read,write,close已經完美地表明這一點。同時,在Linux無論是文件、設備和管道,甚至是個可操作對象對可以視作文件來對待,具體表現為都可以用這個文件標識符來操作他們。
文件標識符非常獨特,並不是指針,其變數類型就是大家非常常用的int。
至於這個東西怎麼用,具體請看如下文件讀寫程序:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//文件控制
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXSIZE 512//緩沖區的大小
const char* FILEPATH="/tmp/file.txt";//文件目錄
int main(void) {
int fd;//文件標識符,
char *s = "被折騰的文字";
char buffer[MAXSIZE+1];//用來接字元的緩沖區
int size;//讀入的文件長度
if((fd=open(FILEPATH,O_CREAT|O_TRUNC|O_RDWR,0777))<0){
//O_CREAT如果指定文件不存在,則創建這個文件,O_EXCL如果要創建的文件已存在,則返回 -1,並且修改 errno 的值
//O_APPEND每次寫操作都寫入文件的末尾,O_TRUNC如果文件存在,並且以只寫/讀寫方式打開,則清空文件全部內容
//O_RDONLY只讀模式,O_WRONLY只寫模式,O_RDWR讀寫模式
//0777為最高許可權
perror("打開文件失敗!");
exit(1);
}
if((write(fd,s,strlen(s)))<0){
perror("寫入文件失敗!");
exit(1);
}
//lseek(fd,0,SEEK_SET);//即把文件指針移至buf文件的開始處
lseek(fd,-strlen(s),SEEK_END);//即把文件指針往從結尾處向前移動strlen(s)個字元
if((size=read(fd,buffer,MAXSIZE))<0){
perror("讀入文件失敗!");
exit(1);
}else{
buffer[size]='\0';//字元串數組封口
printf("%s\n",buffer);
}
if(close(fd)<0) {
perror("關鍵文件失敗!");
exit(1);
}
unlink(FILEPATH);//刪除文件
exit(0);
}
這個程序的一大堆頭文件,是沒辦法的,因為所用到的函數需要的基本頭文件就是這么多,但這些頭文件都是Linux的基本頭文件,能夠拿來直接用。
程序首先打開並同時利用open的參數創建一個文件,之後向這個文件,通過read函數寫入一個名為「緩沖區」buffer的字元數組,也就是字元串string的一些東西,然後,寫入完畢,因為文件操作游標將會移到文件最後,所以我們要先將其移迴文件頭,再利用write函數讀入這個文件的內容到buffer,並列印到屏幕,最後再用close關閉文件標識符與文件的連接,並利用unlink刪除這個文件,如果沒有close,unlink將不起作用,因為這個程序正在佔用這個/tmp/file.txt,無法刪除,如果要強制刪除可以考慮remove函數。
所以,上述代碼的運行結果如下圖:
最後,這個文件自然是要被刪除的了,肯定是沒有的:
上述程序很簡單,但我們更多應該關注這里文件標識符的作用。fd這個int就是文件標識符,相當於FILE *的作用,但他就是一個int。實質上,這個int非常獨特,同open函數,int fd裡面存著要被操作文件的地址,但它卻又不是int *,之後的write和read函數都要根據這個fd所指明的方向來,你可以發現write,read參數都有一個地方,填入了fd,可要求填入的,卻是一個int變數,這在windows裡面是沒有的,同時不了解文件標識符的人,看到write和read的使用可能是雲里霧里的,之後的close就更不用說了,就是清楚這個fd與被操作文件的關聯關系。
unlink函數則和文件標識符無關,需要一個文件路徑的參數。
Ⅷ Linux查看進程打開多少文件描述符命令
可用lsof命令,可以列出被進程所打開的文件的信息。被打開的文件可以是:
1普通的文件,2.目錄 3.網路文件系統的文件,4.字元設備文件 5.(函數)共享庫 6.管道,命名管道 7.符號鏈接 8.底層的socket字流,網路socket,unix域名socket 各個命令的詳細介紹可看下「Linux命令大全」
Ⅸ linux下的文件描述符是什麼
文件描述符是一個很小的正整數,是打開的文件在內核中的索引.
Ⅹ 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 。