Ⅰ linux怎樣獲取文件描述符
Linux下的文件描述符是一個整型數,是對一個文件的標識,fopen打開一個文件就會返回一個相應的文件描述符
Ⅱ 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 中,怎樣使用文件描述符
你說的是在shell里的應用吧,主要是重定向的時候用的多。
Bash的輸入輸出重定向,裡面有一些例子,估計是你想要的:
http://www.linux-wiki.cn/index.php/Bash%E7%9A%84%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E9%87%8D%E5%AE%9A%E5%90%91
Ⅳ linux源碼分析
linux的tcp-ip棧代碼的詳細分析
1.數據結構(msghdr,sk_buff,socket,sock,proto_ops,proto)
bsd套接字層,操作的對象是socket,數據存放在msghdr這樣的數據結構:
創建socket需要傳遞family,type,protocol三個參數,創建socket其實就是創建一個socket實例,然後創建一個文件描述符結構,並且互相建立一些關聯,即建立互相連接的指針,並且初始化這些對文件的寫讀操作映射到socket的read,write函數上來。
同時初始化socket的操作函數(proto_ops結構),如果傳入的type參數是STREAM類型,那麼就初始化為SOCKET->ops為inet_stream_ops,如果是DGRAM類型,則SOCKET-ops為inet_dgram_ops。對於inet_stream_ops其實是一個結構體,包含了stream類型的socket操作的一些入口函數,在這些函數里主要做的是對socket進行相關的操作,同時通過調用下面提到的sock中的相關操作完成socket到sock層的傳遞。比如在inet_stream_ops里有個inet_release的操作,這個操作除了釋放socket的類型空間操作外,還通過調用socket連接的sock的close操作,對於stream類型來說,即tcp_close來關閉sock
釋放sock。
創建socket同時還創建sock數據空間,初始化sock,初始化過程主要做的事情是初始化三個隊列,receive_queue(接收到的數據包sk_buff鏈表隊列),send_queue(需要發送數據包的sk_buff鏈表隊列),backlog_queue(主要用於tcp中三次握手成功的那些數據包,自己猜的),根據family、type參數,初始化sock的操作,比如對於family為inet類型的,type為stream類型的,sock->proto初始化為tcp_prot.其中包括stream類型的協議sock操作對應的入口函數。
在一端對socket進行write的過程中,首先會把要write的字元串緩沖區整理成msghdr的數據結構形式(參見linux內核2.4版源代碼分析大全),然後調用sock_sendmsg把msghdr的數據傳送至inet層,對於msghdr結構中數據區中的每個數據包,創建sk_buff結構,填充數據,掛至發送隊列。一層層往下層協議傳遞。一下每層協議不再對數據進行拷貝。而是對sk_buff結構進行操作。
Ⅳ 關於Linux文件描述符的~
應該是運行完後將結果寫入fd4.out這個文件吧.
gcc編譯c文件就是自動生成個.out文件將程序運行結果寫進去方便查看
Ⅵ Linux文件描述符表和文件的關系
Linux中的文件類型
Linux系統中把一切都看做文件,包括普通文件-、目錄文件d、字元設備文件c、塊設備文件b、符號鏈接文件l。文件描述符是內核為了高效管理已被打開的文件所創建的索引(一個非負整數),用於指代已被打開的文件,Linux下所有的的I/O操作的系統調用都是通過文件描述符執行。例如0表示標准輸入、1表示標准輸出、3表示標准錯誤
,文件描述符會在這個基礎上遞增。
文件描述符、文件、進程之間的關系
每個文件描述符都指向一個打開的文件相對應
不同的文件描述符可能指向同一個打開的文件
相同的文件可能被不同的進程打開,也可以在被同一個進程打開多次
文件描述符表: 進程級的列表,也就是用戶區的一部分,進程每打開一個文件就會新建一個文件描述符,同時只能通過文件描述符的函數訪問,否則進程無法直接對其進行訪問。
系統文件表: 系統級的列表,對當前系統的所有進程都共享,每條條目包含文件偏移量、訪問模式以及指向它的文件描述符的條目計數
文件系統索引節點表: inode索引節點表(UID、GID、ctime、mtime、atime、讀寫執行許可權、鏈接數、block位置)
Ⅶ 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 。