欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

通過(guò)一個(gè)腳本搞懂fork、source和exec

阿銘linux ? 來(lái)源:阿銘linux ? 2023-02-03 16:05 ? 次閱讀

前言

這是一個(gè)經(jīng)常在面試時(shí)被問(wèn)到的一個(gè)問(wèn)題,對(duì)于剛剛接觸shell的初學(xué)者來(lái)說(shuō),確實(shí)不太好搞明白這三者的區(qū)別,下面我通過(guò)兩個(gè)腳本來(lái)幫助你理解它們。

前置知識(shí)點(diǎn)

1)我們所執(zhí)行的任何程序,都是由父進(jìn)程(parent process)所產(chǎn)生出來(lái)的一個(gè)子進(jìn)程(child process),子進(jìn)程在結(jié)束后,將返回到父進(jìn)程去。此現(xiàn)像在Linux系統(tǒng)中被稱(chēng)為fork。當(dāng)子進(jìn)程被產(chǎn)生的時(shí)候,將會(huì)從父進(jìn)程那里獲得一定的資源分配、以及繼承父進(jìn)程的環(huán)境( 如環(huán)境變量)。

2)環(huán)境變量大體可以分為三類(lèi):

  • 內(nèi)置變量:系統(tǒng)提供,不用定義,不能修改,比如$#,$?,$*,$0等
  • 環(huán)境變量:系統(tǒng)提供,不用定義,可以修改,當(dāng)前進(jìn)程及其子進(jìn)程中使用,比如PATH,PWD,SHELL等
  • 用戶(hù)變量(本地變量):用戶(hù)定義,可以修改,在當(dāng)前進(jìn)程使用,比如var=123等

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

4)先準(zhǔn)備兩個(gè)示例腳本:

vi 1.sh ##內(nèi)容如下

#!/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 ##內(nèi)容如下

#!/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"

給兩個(gè)腳本執(zhí)行權(quán)限

chmod +x 1.sh 2.sh

Fork

Fork,字面上就是派生的意思,在當(dāng)前shell中(可以是腳本,也可以是命令行終端)去執(zhí)行一個(gè)bash命令,那么就會(huì)派生一個(gè)sub-shell,也就是所謂的子shell。這個(gè)過(guò)程就是fork。bbd720bc-a398-11ed-bfe3-dac502259ad0.pngFork模式下,子shell會(huì)繼承父shell的環(huán)境變量、用戶(hù)變量,當(dāng)子shell結(jié)束時(shí),子shell里面產(chǎn)生的環(huán)境變量并不會(huì)帶到父shell中。通過(guò)執(zhí)行示例腳本,來(lái)驗(yàn)證上面的結(jié)論:
bash 1.sh fork

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

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

Source

Source模式下,子shell執(zhí)行時(shí)獲取的環(huán)境變量會(huì)會(huì)影響到父shell。與fork的區(qū)別在于,不會(huì)額外打開(kāi)一個(gè)sub-shell來(lái)執(zhí)行被調(diào)用的腳本,而是在同一個(gè)shell中執(zhí)行。所以,被調(diào)用的腳本中聲明的變量和環(huán)境變量, 都可以在主腳本中得到和使用。

下面來(lái)執(zhí)行下示例腳本:

bash 1.sh source

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

1)無(wú)論1.sh還是2.sh,PID都是17164,這說(shuō)明source并不會(huì)開(kāi)啟sub-shell,而是和父shell使用了同一個(gè)進(jìn)程。

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

Exec

Exec模式下,一旦執(zhí)行了子shell,就不會(huì)再去執(zhí)行父shell了。它與fork不同,不需要新開(kāi)一個(gè)sub-shell來(lái)執(zhí)行被調(diào)用的腳本,被調(diào)用的腳本與父shell在同一個(gè)shell內(nèi)執(zhí)行,這個(gè)特性和source一樣。但是使用exec調(diào)用一個(gè)新腳本后, 父shell中exec之后的內(nèi)容就不會(huì)再執(zhí)行了。

我們來(lái)看示例腳本執(zhí)行結(jié)果:

bash 1.sh exec

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

1)1.sh和2.sh的PID都是18633,這說(shuō)明exec和source一樣,并不會(huì)開(kāi)啟sub-shell,而是和父shell使用了同一個(gè)進(jìn)程。

2)exec調(diào)用完2.sh之后,腳本就結(jié)束了,沒(méi)有再繼續(xù),這是exec的特性!

總結(jié)

  • source命令: 不創(chuàng)建子進(jìn)程,在當(dāng)前Shell進(jìn)程中執(zhí)行腳本,會(huì)將新的環(huán)境變量傳遞到當(dāng)前shell來(lái)。
  • exec命令: 不創(chuàng)建子進(jìn)程, 在當(dāng)前Shell進(jìn)程中執(zhí)行腳本,父腳本中exec行之后的內(nèi)容不會(huì)執(zhí)行。
  • fork屬于系統(tǒng)調(diào)用, 會(huì)創(chuàng)建一個(gè)子進(jìn)程, 父進(jìn)程會(huì)阻塞等待子進(jìn)程執(zhí)行結(jié)束, 然后繼續(xù)往下執(zhí)行,子進(jìn)程里的環(huán)境變量不影響父進(jìn)程。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    613

    瀏覽量

    28470
  • Shell
    +關(guān)注

    關(guān)注

    1

    文章

    366

    瀏覽量

    23468
  • 腳本
    +關(guān)注

    關(guān)注

    1

    文章

    392

    瀏覽量

    14947

原文標(biāo)題:通過(guò)一個(gè)腳本搞懂fork、source和exec

文章出處:【微信號(hào):aming_linux,微信公眾號(hào):阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于 forkexec 是如何在 Unix 上工作的

    本文是關(guān)于 forkexec 是如何在 Unix 上工作的。你或許已經(jīng)知道,也有人還不知道。幾年前當(dāng)我了解到這些時(shí),我驚嘆不已。
    的頭像 發(fā)表于 01-22 09:09 ?5074次閱讀

    Linux下多進(jìn)程編程之exec函數(shù)語(yǔ)法及使用實(shí)例

    自己重生?!?如果個(gè)進(jìn)程想執(zhí)行另一個(gè)程序,那么它就可以調(diào)用fork()函數(shù)新建個(gè)進(jìn)程,然后調(diào)
    發(fā)表于 08-14 10:09

    【Linux學(xué)習(xí)雜談】之exec族函數(shù)

    )fork創(chuàng)建的子進(jìn)程是為了單獨(dú)地執(zhí)行新程序宏觀上面是父子進(jìn)程同時(shí)進(jìn)行的。(2)可以利用fork的返回值通過(guò)if判斷在當(dāng)中直接書(shū)寫(xiě)我們的父子進(jìn)程的內(nèi)容,但是這樣有
    發(fā)表于 09-08 13:14

    使用fork/exec/wait/exit等函數(shù)去創(chuàng)建個(gè)進(jìn)程

    運(yùn)行。本期課程首先將會(huì)帶領(lǐng)大家了解什么是進(jìn)程,通過(guò)編程,學(xué)習(xí)使用fork/exec/wait/exit等函數(shù)去創(chuàng)建個(gè)進(jìn)程、管理控制
    發(fā)表于 11-04 08:58

    最常見(jiàn)的fork用法是什么

    的進(jìn)程一模一樣,這兩 個(gè)進(jìn)程都會(huì)繼續(xù)運(yùn)行最常見(jiàn)的fork用法是創(chuàng)建個(gè)新的進(jìn)程,然后使用exec
    發(fā)表于 12-15 07:38

    Linux系統(tǒng)的fork運(yùn)行機(jī)制分析

    如果其中個(gè)進(jìn)程的輸出結(jié)果是“pid1:1001, pid2:1002”,寫(xiě)出其他進(jìn)程的輸出結(jié)果(不考慮進(jìn)程執(zhí)行順序)。 明顯這道題的目的是考察linux下fork的執(zhí)行機(jī)制。下面我們通過(guò)
    發(fā)表于 04-26 16:26 ?1189次閱讀
    Linux系統(tǒng)的<b class='flag-5'>fork</b>運(yùn)行機(jī)制分析

    對(duì)“Fork”做一個(gè)技術(shù)方面的簡(jiǎn)介

    )。隨著 GitHub 的流行,我們經(jīng)常能在各種文章中見(jiàn)到,“fork 某某項(xiàng)目”等說(shuō)法,是的,“fork”這個(gè)直沒(méi)有個(gè)正式的譯名。其實(shí)
    發(fā)表于 04-02 14:48 ?331次閱讀

    最為精簡(jiǎn)的個(gè)Linux Fork炸彈解析

    轉(zhuǎn)自:http://blog.saymagic.cn/2015/03/25/fork-bomb.html Jaromil在2002年設(shè)計(jì)了最為精簡(jiǎn)的個(gè)Linux Fork**
    的頭像 發(fā)表于 09-07 16:12 ?1156次閱讀

    SystemVerilog中的fork-join_any

    fork-join_any和fork-join有所不同,fork-join_any的父進(jìn)程直阻塞,直到任何
    的頭像 發(fā)表于 12-09 09:05 ?2166次閱讀

    Qt中的三個(gè)exec之間有什么聯(lián)系

    在Qt中,常見(jiàn)到三個(gè)exec,第一個(gè)是QApplication::exec(),第二個(gè)是QEventLoop::
    的頭像 發(fā)表于 03-06 09:44 ?2569次閱讀

    分享249個(gè)拿來(lái)即用的shell腳本

    ? 由于腳本案例太多,在此僅展示部分,完整版領(lǐng)取方式請(qǐng)見(jiàn)文末 ? ? ? 249個(gè)拿來(lái)即用的shell腳本! ? 這249個(gè)Shell腳本
    的頭像 發(fā)表于 07-07 10:52 ?1227次閱讀
    分享249<b class='flag-5'>個(gè)</b>拿來(lái)即用的shell<b class='flag-5'>腳本</b>

    為什么shell腳本中執(zhí)行命令要加exec?這個(gè)exec有什么作用呢?

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

    編寫(xiě)個(gè)點(diǎn)名器腳本

    目的:編寫(xiě)個(gè)腳本,可以將準(zhǔn)別好的名字合集的.txt傳入腳本,然后每次隨機(jī)顯示一個(gè)人的姓名
    的頭像 發(fā)表于 11-06 12:41 ?622次閱讀
    編寫(xiě)<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>點(diǎn)名器<b class='flag-5'>腳本</b>

    linux中source命令的用法

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

    docker exec命令的使用方法

    Docker是種開(kāi)源的容器化平臺(tái),可以讓開(kāi)發(fā)人員在容器中打包和運(yùn)行應(yīng)用程序。它提供了種快速、可靠和致的方式來(lái)構(gòu)建、部署和運(yùn)行應(yīng)用程序。Docker exec命令是Docker提供
    的頭像 發(fā)表于 11-23 09:33 ?1734次閱讀