shell運用中exec與文件描述符

 首先咱們需瞭解‘文件描述符’的概念,內核(kernel)利用文件描述符(file descriptor)來訪問文件。文件描述符是非負整數。打開現存文件或新建文件時,內核會返回一個文件描述符。讀寫文件也須要使用文件描述符來指定待讀寫的文件。ide

  文件描述符是由無符號整數表示的句柄,進程使用它來標識打開的文件。文件描述符與包括相關信息(如文件的打開模式、文件的位置類型、文件的初始類型等)的文件對象相關聯,這些信息被稱做文件的上下文url

如何建立文件描述符
進程獲取文件描述符最多見的方法是經過本機 子例程 open或create獲取或者經過從 父進程 繼承。後一種方法容許子進程一樣可以訪問由 父進程 使用的文件。文件描述符對於每一個進程通常是惟一的。當用fork 子例程 建立某個子進程時,該子進程會得到其父進程全部文件描述符的副本,這些文件描述符在執行fork時打開。在由fcntl、dup和 dup2 子例程複製或拷貝某個進程時,會發生一樣的複製過程。
對於每一個進程, 操做系統 內核 在u_block結構中維護文件描述符表,全部的文件描述符都在該表中創建索引。

################################################################################################################################################################################## spacer.gif

echo 123546 > 2.txt ******》123546重定向到一個2.txt的文件
spa

exec 4<> 2.txt ******》以讀寫的方式綁定到文件描述符「4」中(能夠理解「4」爲一個設置的變量)
read -n 4 <&4 ******》從&4中讀取4個字符(& 是在重定向裏用來表示文件描述符,&0 表示標準輸入。若是不用 & 那就會被認爲是以 0 爲名字的文件了,因此這其實也是一個語法的規定而已。)
echo -n . >&4 ******》向&4中以橫向增長一個點「.」(由於以前設置了'read -n 4',因此這個點將加在第四位後面,即1235.6;若是是「..」,那麼就是1235..)
exec 4>&- ******》關閉輸出文件描述符4
##############################################################################################################################################舉例以下:
[root@david /tmp 02:27 &50]#echo 123456 >2.txt
[root@david /tmp 02:28 &51]#cat 2.txt
123456
[root@david /tmp 02:28 &52]#exec 8<>2.txt
[root@david /tmp 02:28 &53]#cat 2.txt
123456
[root@david /tmp 02:28 &54]#read -n 4 <&8
[root@david /tmp 02:29 &55]#cat 2.txt
123456
[root@david /tmp 02:29 &56]#echo -n .. >&8
[root@david /tmp 02:30 &57]#cat 2.txt
1234..
[root@david /tmp 02:30 &58]#exec 8>&-
[root@david /tmp 02:31 &59]#cat 2.txt
1234..
##############################################################################################################################################
相關文章
相關標籤/搜索