linux之exec命令詳解

1、介紹shell script:
  有兩種方法執行shell scripts。
  一種是新產生一個shell,然後執行相應的shell scripts;新產生一個shell然後再執行scripts的方法是在scripts文件開頭加入以下語句。一般的script文件(.sh)即是這種用法。這種方法先啓用新的sub-shell(新的子進程),然後在其下執行命令

#!/bin/sh

  一種是在當前shell下執行,不再啓用其他shell。即source命令,不再產生新的shell,而在當前shell下執行一切命令。source命令即點(.)命令。

source:

2、exec命令:
系統調用exec是以新的進程去代替原來的進程,但進程的PID保持不變。因此,可以這樣認爲,exec系統調用並沒有創建新的進程,只是替換了原來進程上下文的內容。原進程的代碼段,數據段,堆棧段被新的進程所代替。

執行exec系統調用,一般都是這樣,用fork()函數新建立一個進程,然後讓進程去執行exec調用。我們知道,在fork()建立新進程之後,父進各與子進程共享代碼段,但數據空間是分開的,但父進程會把自己數據空間的內容copy到子進程中去,還有上下文也會copy到子進程中去。而爲了提高效率,採用一種寫時copy的策略,即創建子進程的時候,並不copy父進程的地址空間,父子進程擁有共同的地址空間,只有當子進程需要寫入數據時(如向緩衝區寫入數據),這時候會複製地址空間,複製緩衝區到子進程中去。從而父子進程擁有獨立的地址空間。而對於fork()之後執行exec後,這種策略能夠很好的提高效率,如果一開始就copy,那麼exec之後,子進程的數據會被放棄,被新的進程所代替。

3、 exec與system的區別:
(1) exec是直接用新的進程去代替原來的程序運行,運行完畢之後不回到原先的程序中去。
(2) system是調用shell執行你的命令,system=fork+exec+waitpid,執行完畢之後,回到原先的程序中去。繼續執行下面的部分。
總之,如果你用exec調用,首先應該fork一個新的進程,然後exec. 而system不需要你fork新進程,已經封裝好了。

4、exec I/O重定向:

 exec ls        //在shell中執行ls,ls結束後不返回原來的shell中了
 exec           //將file中的內容作爲exec的標準輸入
 exec >file     //將file中的內容作爲標準寫出
 exec 3         //將file讀入到fd3中
 sort <&3       //fd3中讀入的內容被分類
 exec 4>file    //將寫入fd4中的內容寫入file中
 ls >&4         //Ls將不會有顯示,直接寫入fd4中了,即上面的file中
 exec 5<&4      //創建fd4的拷貝fd5
 exec 3<&-      //關閉fd3

先上我們進如/dev/fd/目錄下看一下:

這裏寫圖片描述

默認會有這四個項:
0是標準輸入,默認是鍵盤。 stdin
1是標準輸出,默認是屏幕/dev/tty stdout
2是標準錯誤,默認也是屏幕 stderr
255

對 2>&1詳細說明一下 :2>&1 也就是 FD2=FD1 ,這裏並不是說FD2 的值 等於FD1的值,因爲 > 是改變送出的數據信道,也就是說把 FD2 的 “數據輸出通道” 改爲 FD1 的 “數據輸出通道”。如果僅僅這樣,這個改變好像沒有什麼作用,因爲 FD2 的默認輸出和 FD1的默認輸出本來都是 monitor,一樣的!

下面舉例子說明:

liqian@liqian-Aspire-E1-471G:~$ exec>test
liqian@liqian-Aspire-E1-471G:~$ ls
liqian@liqian-Aspire-E1-471G:~$ pwd
liqian@liqian-Aspire-E1-471G:~$ echo "hello"
liqian@liqian-Aspire-E1-471G:~$ exec>/dev/tty
liqian@liqian-Aspire-E1-471G:~$ cat test
test
公共的
模板
視頻
圖片
文檔
下載
音樂
桌面
/home/liqian
hello
liqian@liqian-Aspire-E1-471G:~$ 

說明:exec >text 是將當前shell的標準輸出都打開到text文件中

root@liqian-Aspire-E1-471G:/home# cd /dev/fd
root@liqian-Aspire-E1-471G:/dev/fd# ls
0  1  2  255
root@liqian-Aspire-E1-471G:/dev/fd# 
root@liqian-Aspire-E1-471G:/dev/fd# exec 3>/home/test
root@liqian-Aspire-E1-471G:/dev/fd# ls
0  1  2  255  3
root@liqian-Aspire-E1-471G:/dev/fd# 

此處多了個3,也就是又增加了一個設備,這裏也可以體會下linux設備即文件的理念。這時候fd3就相當於一個管道了,重定向到fd3中的文件會被寫在test中。關閉這個重定向可以用exec 3>&-。

root@liqian-Aspire-E1-471G:/dev/fd# who >&3
root@liqian-Aspire-E1-471G:/dev/fd# ls >&3
root@liqian-Aspire-E1-471G:/dev/fd# exec 3>&-
root@liqian-Aspire-E1-471G:/dev/fd# cat /home/test
liqian   :0           2015-12-09 21:20 (:0)
liqian   pts/9        2015-12-09 22:11 (:0)
0
1
2
255
3
root@liqian-Aspire-E1-471G:/dev/fd# 
發佈了41 篇原創文章 · 獲贊 18 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章