精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

通過一個腳本搞懂fork、source和exec

阿銘linux ? 來源:阿銘linux ? 2023-02-03 16:05 ? 次閱讀

前言

這是一個經常在面試時被問到的一個問題,對于剛剛接觸shell的初學者來說,確實不太好搞明白這三者的區別,下面我通過兩個腳本來幫助你理解它們。

前置知識點

1)我們所執行的任何程序,都是由父進程(parent process)所產生出來的一個子進程(child process),子進程在結束后,將返回到父進程去。此現像在Linux系統中被稱為fork。當子進程被產生的時候,將會從父進程那里獲得一定的資源分配、以及繼承父進程的環境( 如環境變量)。

2)環境變量大體可以分為三類:

  • 內置變量:系統提供,不用定義,不能修改,比如$#,$?,$*,$0等
  • 環境變量:系統提供,不用定義,可以修改,當前進程及其子進程中使用,比如PATH,PWD,SHELL等
  • 用戶變量(本地變量):用戶定義,可以修改,在當前進程使用,比如var=123等

3)環境變量只能從父進程到子進程單向繼承。換句話說:在子進程中的環境如何變更,均不會影響父進程的環境。

4)先準備兩個示例腳本:

vi 1.sh ##內容如下

#!/bin/bash
A=aminglinux
echo "PID for 1.sh before exec/source/fork:$$"
export A
echo "1.sh: $A is $A"


case $1 in
    fork)
        echo "using fork"
        bash 2.sh
        ;;
    source)
        echo "using source"
        source 2.sh
        ;;
    exec)
        echo "using exec"
        exec ./2.sh
        ;;
    *)
        echo "using fork"
        bash 2.sh
        ;;
esac


echo "PID for 1.sh after exec/source/fork:$$"
echo"1.sh:$Ais$A"

vi 2.sh ##內容如下

#!/bin/bash
echo "PID for 2.sh: $$"
echo "2.sh get $A=$A from 1.sh"
A=ops
export A
echo "2.sh: $A is $A"

給兩個腳本執行權限

chmod +x 1.sh 2.sh

Fork

Fork,字面上就是派生的意思,在當前shell中(可以是腳本,也可以是命令行終端)去執行一個bash命令,那么就會派生一個sub-shell,也就是所謂的子shell。這個過程就是fork。bbd720bc-a398-11ed-bfe3-dac502259ad0.pngFork模式下,子shell會繼承父shell的環境變量、用戶變量,當子shell結束時,子shell里面產生的環境變量并不會帶到父shell中。通過執行示例腳本,來驗證上面的結論:
bash 1.sh fork

bbe4dc84-a398-11ed-bfe3-dac502259ad0.png

1)1.sh的PID為15242也就是父shell的PID,而2.sh的PID為15243,這個是子shell的PID。2)在1.sh里定義了變量A,值為aminglinux,然后fork了一個子shell去執行了2.sh,在2.sh里變量A的值是ops,但是當2.sh執行完后,再回到1.sh,變量A的值依然是aminglinux。

Source

Source模式下,子shell執行時獲取的環境變量會會影響到父shell。與fork的區別在于,不會額外打開一個sub-shell來執行被調用的腳本,而是在同一個shell中執行。所以,被調用的腳本中聲明的變量和環境變量, 都可以在主腳本中得到和使用。

下面來執行下示例腳本:

bash 1.sh source

bbff84e4-a398-11ed-bfe3-dac502259ad0.png

1)無論1.sh還是2.sh,PID都是17164,這說明source并不會開啟sub-shell,而是和父shell使用了同一個進程。

2)source 2.sh后,變量A的值變成了ops,而后也被帶到了1.sh里。

Exec

Exec模式下,一旦執行了子shell,就不會再去執行父shell了。它與fork不同,不需要新開一個sub-shell來執行被調用的腳本,被調用的腳本與父shell在同一個shell內執行,這個特性和source一樣。但是使用exec調用一個新腳本后, 父shell中exec之后的內容就不會再執行了。

我們來看示例腳本執行結果:

bash 1.sh exec

bc0eb0fe-a398-11ed-bfe3-dac502259ad0.png

1)1.sh和2.sh的PID都是18633,這說明exec和source一樣,并不會開啟sub-shell,而是和父shell使用了同一個進程。

2)exec調用完2.sh之后,腳本就結束了,沒有再繼續,這是exec的特性!

總結

  • source命令: 不創建子進程,在當前Shell進程中執行腳本,會將新的環境變量傳遞到當前shell來。
  • exec命令: 不創建子進程, 在當前Shell進程中執行腳本,父腳本中exec行之后的內容不會執行。
  • fork屬于系統調用, 會創建一個子進程, 父進程會阻塞等待子進程執行結束, 然后繼續往下執行,子進程里的環境變量不影響父進程。

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 變量
    +關注

    關注

    0

    文章

    613

    瀏覽量

    28329
  • Shell
    +關注

    關注

    1

    文章

    363

    瀏覽量

    23294
  • 腳本
    +關注

    關注

    1

    文章

    387

    瀏覽量

    14831

原文標題:通過一個腳本搞懂fork、source和exec

文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    關于 forkexec 是如何在 Unix 上工作的

    本文是關于 forkexec 是如何在 Unix 上工作的。你或許已經知道,也有人還不知道。幾年前當我了解到這些時,我驚嘆不已。
    的頭像 發表于 01-22 09:09 ?4988次閱讀

    Linux下多進程編程之exec函數語法及使用實例

    自己重生。● 如果進程想執行另一個程序,那么它就可以調用fork()函數新建進程,然后調
    發表于 08-14 10:09

    【Linux學習雜談】之exec族函數

    )fork創建的子進程是為了單獨地執行新程序宏觀上面是父子進程同時進行的。(2)可以利用fork的返回值通過if判斷在當中直接書寫我們的父子進程的內容,但是這樣有
    發表于 09-08 13:14

    使用fork/exec/wait/exit等函數去創建進程

    運行。本期課程首先將會帶領大家了解什么是進程,通過編程,學習使用fork/exec/wait/exit等函數去創建進程、管理控制
    發表于 11-04 08:58

    最常見的fork用法是什么

    的進程一模一樣,這兩 進程都會繼續運行最常見的fork用法是創建新的進程,然后使用exec
    發表于 12-15 07:38

    Linux系統的fork運行機制分析

    如果其中進程的輸出結果是“pid1:1001, pid2:1002”,寫出其他進程的輸出結果(不考慮進程執行順序)。 明顯這道題的目的是考察linux下fork的執行機制。下面我們通過
    發表于 04-26 16:26 ?1155次閱讀
    Linux系統的<b class='flag-5'>fork</b>運行機制分析

    對“Fork”做一個技術方面的簡介

    )。隨著 GitHub 的流行,我們經常能在各種文章中見到,“fork 某某項目”等說法,是的,“fork”這個直沒有正式的譯名。其實
    發表于 04-02 14:48 ?285次閱讀

    最為精簡的Linux Fork炸彈解析

    轉自:http://blog.saymagic.cn/2015/03/25/fork-bomb.html Jaromil在2002年設計了最為精簡的Linux Fork**
    的頭像 發表于 09-07 16:12 ?1103次閱讀

    SystemVerilog中的fork-join_any

    fork-join_any和fork-join有所不同,fork-join_any的父進程直阻塞,直到任何
    的頭像 發表于 12-09 09:05 ?2080次閱讀

    Qt中的三exec之間有什么聯系

    在Qt中,常見到三exec,第一個是QApplication::exec(),第二是QEventLoop::
    的頭像 發表于 03-06 09:44 ?2307次閱讀

    分享249拿來即用的shell腳本

    ? 由于腳本案例太多,在此僅展示部分,完整版領取方式請見文末 ? ? ? 249拿來即用的shell腳本! ? 這249Shell腳本
    的頭像 發表于 07-07 10:52 ?1150次閱讀
    分享249<b class='flag-5'>個</b>拿來即用的shell<b class='flag-5'>腳本</b>

    為什么shell腳本中執行命令要加exec?這個exec有什么作用呢?

    正常情況下,如果我們想要在shell腳本中執行命令,我們只用將該命令原樣寫到這個shell腳本中就好了。
    的頭像 發表于 08-21 09:10 ?2877次閱讀
    為什么shell<b class='flag-5'>腳本</b>中執行命令要加<b class='flag-5'>exec</b>?這個<b class='flag-5'>exec</b>有什么作用呢?

    編寫點名器腳本

    目的:編寫腳本,可以將準別好的名字合集的.txt傳入腳本,然后每次隨機顯示一個人的姓名
    的頭像 發表于 11-06 12:41 ?565次閱讀
    編寫<b class='flag-5'>一</b><b class='flag-5'>個</b>點名器<b class='flag-5'>腳本</b>

    linux中source命令的用法

    在Linux中,source命令通常用于重新執行剛修改的初始化文件,使之立即生效,而不必注銷并重新登錄。source命令可以用于讀取并執行腳本文件中的命令,通常用于在當前shell環境中重新加載
    的頭像 發表于 11-08 14:35 ?2239次閱讀

    docker exec命令的使用方法

    Docker是種開源的容器化平臺,可以讓開發人員在容器中打包和運行應用程序。它提供了種快速、可靠和致的方式來構建、部署和運行應用程序。Docker exec命令是Docker提供
    的頭像 發表于 11-23 09:33 ?1557次閱讀