關于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"*   ...
一周排行
  • JAVA開發過程中,一些受限的庫拒絕使用的解決方法
    在閱讀Disruptor代碼,並編譯運行的過程中,出現了如下問題,導致代碼無法編譯成功: ...
  • 一.早前的幾個網路框架1.ASI框架: HTTP終結者.很牛, 但是有BUG, 已經停止更新.2.MKNetworkKit (印度人寫的).3.AFN一直還在更新.AFNetworking的出現:MAC/iOS設計的 ...
  •     鏈接地址:http://www.xx566.com/detail/104.html    從JDK1.5開始,引入了自動裝箱和自動拆箱的概念,實現了把基本數據類型轉化爲對象,以及把對象轉化爲基本數據類型,這給 ...
  • select *from 表名 as of timestamp sysdate -(1/(24))  where  條件 create table 臨時表名 as  select * from  需要恢複數據的表名  ...
  • 首先我想說問這些問題的除了第三個問題可能會有人跟你講講什麽個意思以外,估計大部分問題都是未遂...有人問完沒反應還說 "大家不幫我"...不是不幫你,是你問問題不會問,問得太二,是你問的問題別人沒 ...
  • 登陸mysqlmysql -u root -p;查詢mysql用戶select user,password,host from user;創建遠程登錄root賬號並設置密碼GRANT ALL PRIVILEGES O ...
  • Android TagFlowLayout完全解析 一款針對Tag的布局
    一.概述本文之前,先提一下關于上篇博文的100多萬訪問量請無視,博文被刷,我也很郁悶,本來 ...
  • 喜歡和不喜歡Go語言的都喜歡拿效能PK說事.流傳比較廣的是benchmarksgame的PK數據: http://benchmarksgame.alioth.debian.org/u64q/go.php在 bench ...
  • 定義一個下拉列表:xtype : 'selectfield', label : '這是下拉列表', labelWrap : true,//自動換行 displayField:"newText",/ ...
  • Python十九:線程
         今天來簡單看一下使用Python進行線程編程,由于之前接觸過Windows下的進 ...