關于Shell文件描述符

轉自:http://zhu8337797.blog.163.com/blog/static/170617549201161955814278/
 
Linux系統中, 每當進程打開一個文件時,系統就爲其分配一個唯一的整型文件描述符,用來標識這個文件。大家知道,標准C中每個進程默認打開的有三個文件,標准輸入,標准輸出,標准錯誤,分別用一個FILE結構的指針來表示,即stdin,stout,sterr,這三個結構分別維護著三個文件描述符0,1,2。我們也可以自己創建文件描述符3~8。
 
打開文件描述符
Shell中,0,1,2是默認可用的三個描述符,爲了利用其它文件描述符來標識特定文件,我們需要使用exec命令來打開該文件,並指定一個數字作爲描述符:
exec m> outfile
exec n< infile
第一行以輸出方式打開文件outfile並且賦予文件描述符m,第二行以輸入方式打開文件infile並且賦予文件描述符n。
 
複制文件描述符
符號<&可以複制一個輸入描述符,符號>&可以複制一個輸出描述符:
exec n<&m
以exec命令打開文件描述符n並將其作爲文件描述符m的副本。
 
關閉文件描述符
exec n<&-
exec m<&-
以exec命令關閉文件描述符n和文件描述符m。
代碼:
#!/bin/bash
echo "111"
exec 6>&1        #Save stdout to fd 6 文件描述符6複制描述符1 即6具備標准輸出的功能
exec 1>>suc.txt  重新定義標准輸出將標准輸出追加到suc.txt
echo "222"       這時標准輸出爲222 會追加到suc.txt
exec 1>&6 6>&-  # Restore stdout and close fd 6.  再次重新定義文件描述符1 將文件描述符6(標准輸出)複制給文件描述符1,這是1的功能就是標准輸出了,同時關閉文件描述符6
echo "333"     標准輸出爲333 丟給文件描述符1,而1就是標准輸出,于是就輸出爲333
當某個程序打開文件時,操作系統返回相應的文件描述符,程序爲了處理該文件必須引用此描述符。所謂的文件描述符是一個低級的正整數。最前面的三個文件描述符(0,1,2)分別與標准輸入(stdin),標准輸出(stdout)和標准錯誤(stderr)對應。因此,函數 scanf() 使用 stdin,而函數 printf() 使用 stdout。你可以用不同的文件描述符改寫默認的設置並重定向進程的 I/O 到不同的文件。
1、首先說什麽是文件描述符,它有什麽作用?
文件描述符是一個簡單的整數,用以標明每一個被進程所打開的文件和socket。第一個打開的文件是0,第二個是1,依此類推。Unix 操作系統通常給每個進程能打開的文件數量強加一個限制。更甚的是,unix 通常有一個系統級的限制。
因爲squid 的工作方式,文件描述符的限制可能會極大的影響效能。當squid 用完所有的文件描述符後,它不能接收用戶新的連接。也就是說,用完文件描述符導致拒絕服務。直到一部分當前請求完成,相應的文件和socket 被關閉,squid 不能接收新請求。當squid發現文件描述符短缺時,它會發布警告。
在運行./configure 之前,檢查你的系統的文件描述符限制是否合適,能給你避免一些麻煩。大多數情況下,1024 個文件描述符足夠了。非常忙的cache可能需要4096或更多。在配置文件描述符限制時,我推薦設置系統級限制的數量爲每個進程限制的2 倍。
2、怎麽突破,具體方法?
先查看LINUX默認的文件描述符:
# ulimit -n
1024
我們用命令
ulimit -HSn 65536
來增大文件描述符,然後編譯安裝squid,
把ulimit -HSn 65536放到/etc/rc.d/rc.local讓啓動時載入。
以下爲轉載:
Linux
在Linux 上配置文件描述符有點複雜。在編譯squid 之前,你必須編輯系統include 文件中的一個,然後執行一些shell 命令。請首先編輯/usr/include/bits/types.h 文件,改變__FD_SETSIZE 的值:
#define _ _FD_SETSIZE 8192
下一步,使用這個命令增加內核文件描述符的限制:
# echo 8192 >; /proc/sys/fs/file-max
最後,增加進程文件描述符的限制,在你即將編譯squid 的同一個shell 裏執行:
sh# ulimit -Hn 8192
該命令必須以root 運行,僅僅運行在bash shell。不必重啓機器。
使用這個技術,你必須在每一次系統啓動後執行上述echo 和ulimit 命令,或者至少在squid 啓動之前。假如你使用某個rc.d 腳本來啓動squid,那是一個放置這些命令的好地方。



更多相關文章
  • 文件系統相關的shell命令
        LINUX下文件系統的類型有7種文件類型,APUE中講到,通過調用stat,可以看出文件的類型存儲在st_mode裏面. 這其中文件類型分別是:S_ISREG 普通文件S_ISDIR 目錄文件S_ISCHR 字符特殊文件S_ISBLK 塊設備文件S_ISFIFO 管道文件S_ISLNK 符號 ...
  • wordpress主題制作教程(六):使用自定義字段添加關鍵詞和描述信息
    上一篇教程中,我們制作的header.php文件並沒有添加關鍵詞和描述信息,雖然現在有人說百度對關鍵字和描述信息已經不看重了,但是有總比沒有好,規範總比不規範好.所以我們還是添加關鍵詞和描述信息.當然,我們前面在頭部添加了wp_head函數,所以我們可以使用seo插件來輸出關鍵詞和描述. 打開我們主 ...
  • 用編輯器打開主題的header.php,在<head>與</head>之間任意地方(一般加到</title>下面比較美觀)加上如下代碼:<?php //如果是首頁 if (is_home()){     $keywords = "你網站首頁的關鍵字 ...
  • [轉載]轉:關于java文件讀寫.字節流.字符流的一點新得 關于編碼方式我們不講,有興趣自己去看,這裏大概提一下. UTF-16采用等幅編碼,即每個字符占2個字節.優點:簡單:缺點:西文會膨脹到200%,冗余!而且字與字之間的疆界不好找,容易劃分錯誤,沒有考慮好前綴問題.這一點huffman編碼做的 ...
  • 想知道nm命令的實現原理嗎---分析AIX平台下ELF文件的符號表
    在AIX及其他unix/linux平台上,我們可以使用nm, objdump和readelf來分析ELF文件的符號表.具體使用方式是:nm objfile objdump -x objfile (或其他選項)readelf -a objfile但我們有時候需要在程序中來分析某個ELF文件(比如當前進 ...
  •     Java多線程編程是非常考驗一個程序員水平的.傳統的WEB程序中,因爲框架提供了太多的健壯性.並發性.可靠性的支持,所以我們都是將所有的注意力放到了業務實現上.我們只是按照業務邏輯的要求,不停的積累自己的代碼.因爲知識,或者是經驗的限制,經常出現了問題而不自知.例如,某些比較原始的專案中,並 ...
  • shell腳本中定義變量的方式很自由(弱類型),直接使用:var_name=var_value 就行了.獲取其值也簡單,只需要在值前面添加$符號:echo "${var_name}".shell運行時,有些變量根據當前運行環境已經內置好了,十分方便我們使用. 位置參數:當腳本被調 ...
  • 簡介編輯 文檔類型定義可定義合法的 標准通用標記語言. 可擴展標記語言文檔構建模塊.它使用一系列合法的元素來定義文檔的結構. 文檔類型定義可被成行地聲明于 標准通用標記語言. 可擴展標記語言文檔中,也可作爲一個外部引用. 2文檔類型聲明編輯 文檔類型定義(DTD)可定義合法的XML文檔構建模塊. 它 ...
  • 在shell中常用的特殊符號羅列如下:# ;    ;;       .       ,        /        \        'string'|        !    $    ${}    $?       $$    $*        "string"*   ...
一周排行
  • 第一步:創建2個NSNotificationCenter監聽[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appl ...
  • 在華爲開始創業的20世紀80年代中後期,國內誕生了400多家通信制造類企業,但這個行業注定是場死亡競賽,贏者一定是死得最晚的那個.華爲活到了最後.華爲爲什麽可以活到最後?這確實是一家"怪異"的企業 ...
  • //證件號碼校驗function isIdentifyNumber(obj,id){    var selectValue = document.getElementById(id).value; //獲取selec ...
  • 作者:gfree.wind@gmail.com博客:blog.focus-linux.net   linuxfocus.blog.chinaunix.net 另外有一點要注意的是,由于likely定義時用的常量是1, ...
  • img載入圖片錯誤的時候,如何給個默認圖? Img載入錯誤的時候不要那個"紅叉",給一個默認的透明的小圖片,如何實現? 利用 Img的onerror事件.例如:<img src=" ...
  •     時間複雜度:O(N)     空間複雜度:2N pseudocode: maxDirectedDiff(array[] a) { minNumber[] m m[1] = a[1] for i = 2 ... ...
  • 微信公衆號接口深入剖析與應用多接口集合應用與重用技術開發(圖文導航)
    前幾天有幾個朋友叫我出一個關于公衆號發送位置導航的教程,迫于時間壓力才今天開始寫寫,我先說 ...
  • 題意:移牌遊戲,按以下規則:1. 從左向右, 考慮每張牌, 若某張牌與其左邊第1張或左邊第3張是同一個牌號或花色, 則就把這張牌移到左邊的匹配牌上方, 並繼續向左邊移動, 直至左邊第1張或第3張都不是符合的牌爲止.2 ...
  • 一.入門1.    簡介Kafka is a distributed, partitioned, replicated commit log service.它提供了類似于JMS的特性,但是在設計實現上完全不同,此外 ...
  • PHP是不支持線程的,但是我們有總想並行地幹一些事情,比如,同時執行多個http的請求,如果使用多進程的話,有兩個問題:1. 不能跨平台2. 創建進程的開銷似乎大了些于是,我們就想到了使用異步來達到類似並行的效果,曾 ...