fork source exec區別差異

2021-09-07 06:13:46 字數 2762 閱讀 1468

fork

使用 fork 方式執行 script 時, 就是讓 shell(parent process) 產生乙個 child

process 去執行該 script, 當 child process 結束後, 會返回 parent process,

但 parent process 的環境是不會因 child process 的改變而改變的.

source

使用 source 方式執行 script 時, 就是讓 script 在當前 process 內執行, 而不

是產生乙個 child process 來執行. 由於所有執行結果均於當前 process 內完成,

若 script 的環境有所改變, 當然也會改變當前 process 環境了.

exec

使用 exec 方式執行script時, 它和 source 一樣, 也是讓 script 在當前process

內執行, 但是 process 內的原**剩下部分將被終止. 同樣, process 內的環境隨

script 改變而改變.

*

fork

(/directory/script.sh)

fork是最普通的, 就是直接在指令碼裡面用/directory/script.sh來呼叫script.sh這個指令碼.

執行的時候開乙個sub-shell執行呼叫的指令碼,sub-shell執行的時候, parent-shell還在。

sub-shell執行完畢後返回parent-shell.

sub-shell從parent-shell繼承環境變數.但是sub-shell中的環境變數不會帶回parent-shell

*exec

(exec

/directory/script.sh)

exec與fork不同,不需要新開乙個sub-shell來執行被呼叫的指令碼. 被呼叫的指令碼與父指令碼在同乙個shell內執行。但是使用exec呼叫乙個新指令碼以後, 父指令碼中exec行之後的內容就不會再執行了。這是exec和source的區別

*source (source /directory/script.sh)

與fork的區別是不新開乙個sub-shell來執行被呼叫的指令碼,而是在同乙個shell中執行. 所以被呼叫的指令碼中宣告的變數和環境變數, 都可以在主指令碼中得到和使用.

可以通過下面這兩個指令碼來體會三種呼叫方式的不同:

1.sh

#!/bin/bash

a=becho "pid for 1.sh before exec/source/fork:$$"

export a

echo "1.sh: \$a is $a"

case $

1 in

exec

)echo "using exec…"

exec

./2.sh ;

;source)

echo "using source…"..

/2.sh ;;*

)echo "using fork by default…"

./2.sh ;

;esac

echo "pid for 1.sh after exec/source/fork:$$"

echo "1.sh: \$a is $a"

2.sh

#!/bin/bash

echo "pid for 2.sh: $$"

echo "2.sh get \$a=$a from 1.sh"

a=cexport a

echo "2.sh: \$a is $a"

執**況:$.

/1.sh

pid for 1.sh before exec

/source/

fork

:5845364

1.sh:

$a is b

using fork by default…

pid for 2.sh: 5242940

2.sh get $

a=b from 1.sh

2.sh:

$a is c

pid for 1.sh after exec

/source/

fork

:5845364

1.sh:

$a is b$.

/1.sh exec

pid for 1.sh before exec

/source/

fork

:5562668

1.sh:

$a is b

using exec…

pid for 2.sh: 5562668

2.sh get $

a=b from 1.sh

2.sh:

$a is c$.

/1.sh source

pid for 1.sh before exec

/source/

fork

:5156894

1.sh:

$a is b

using source…

pid for 2.sh: 5156894

2.sh get $

a=b from 1.sh

2.sh:

$a is c

pid for 1.sh after exec

/source/

fork

:5156894

1.sh:

$a is c

$

Shell中fork source exec的區別

fork是linux的系統呼叫,用來建立子程序,子程序是父程序的乙個副本,從父程序那裡獲得一定的資源分配以及繼承父程序的環境。子程序與父程序唯一不同的地方在於pid process id 環境變數 傳給子程序的變數,遺傳性是本地變數和環境變數的根本區別 只能單向從父程序傳給子程序。不管子程序的環境變...

堆區 棧區 靜態區 常量區還有???

常見的儲存區域可分為 由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,程式會一直占用記憶體,導致記憶體洩漏...

c 棧區 堆區 常量區

c 中棧區 堆區 常量區 由一道面試題目而學習 2009 04 28 21 01 include void main 對應的彙編 10 a c 1 00401067 8a 4d f1 mov cl,byte ptr ebp 0fh 0040106a 88 4d fc mov byte ptr ebp...