成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

linux的fork命令,linux中fork函數(shù)詳解原創(chuàng)!!實(shí)例講解

linux中fork,source和exec的區(qū)別

exec和source都屬于bash內(nèi)部命令(builtins commands),在bash下輸入man exec或man source可以查看所有的內(nèi)部命令信息。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了四川免費(fèi)建站歡迎大家使用!

bash shell的命令分為兩類:外部命令和內(nèi)部命令。外部命令是通過系統(tǒng)調(diào)用或獨(dú)立的程序?qū)崿F(xiàn)的,如sed、awk等等。內(nèi)部命令是由特殊的文件格式(.def)所實(shí)現(xiàn),如cd、history、exec等等。

在說明exec和source的區(qū)別之前,先說明一下fork的概念。

fork是linux的系統(tǒng)調(diào)用,用來創(chuàng)建子進(jìn)程(child process)。子進(jìn)程是父進(jìn)程(parent process)的一個(gè)副本,從父進(jìn)程那里獲得一定的資源分配以及繼承父進(jìn)程的環(huán)境。子進(jìn)程與父進(jìn)程唯一不同的地方在于pid(process id)。

環(huán)境變量(傳給子進(jìn)程的變量,遺傳性是本地變量和環(huán)境變量的根本區(qū)別)只能單向從父進(jìn)程傳給子進(jìn)程。不管子進(jìn)程的環(huán)境變量如何變化,都不會(huì)影響父進(jìn)程的環(huán)境變量。

shell script:

有兩種方法執(zhí)行shell scripts,一種是新產(chǎn)生一個(gè)shell,然后執(zhí)行相應(yīng)的shell scripts;一種是在當(dāng)前shell下執(zhí)行,不再啟用其他shell。

新產(chǎn)生一個(gè)shell然后再執(zhí)行scripts的方法是在scripts文件開頭加入以下語句

#!/bin/sh

一般的script文件(.sh)即是這種用法。這種方法先啟用新的sub-shell(新的子進(jìn)程),然后在其下執(zhí)行命令。

另外一種方法就是上面說過的source命令,不再產(chǎn)生新的shell,而在當(dāng)前shell下執(zhí)行一切命令。

source:

source命令即點(diǎn)(.)命令。

在bash下輸入man source,找到source命令解釋處,可以看到解釋"Read and execute commands from filename in the current shell environment and ..."。從中可以知道,source命令是在當(dāng)前進(jìn)程中執(zhí)行參數(shù)文件中的各個(gè)命令,而不是另起子進(jìn)程(或sub-shell)。source filename or .filename 執(zhí)行filename中的命令。

exec:

在bash下輸入man exec,找到exec命令解釋處,可以看到有"No new process is created."這樣的解釋,這就是說exec命令不產(chǎn)生新的子進(jìn)程。那么exec與source的區(qū)別是什么呢?

exec命令在執(zhí)行時(shí)會(huì)把當(dāng)前的shell process關(guān)閉,然后換到后面的命令繼續(xù)執(zhí)行。

======================================================================================================================

下面我們寫個(gè)腳本來測(cè)試一下,這樣你就會(huì)很容易的讀懂我上面所說的東西~

1.sh

#!/bin/bashA=Becho?"PID?for?1.sh?before?exec/source/fork:

"exportAecho"1.sh:$Ais$A"case$1inexec)echo"usingexec..."exec./2.sh;;source)echo"usingsource..."../2.sh;;?)echo"usingforkbydefault..."./2.sh;;esacecho"PIDfor1.shafterexec/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=C

export?A

echo?"2.sh:?\$A?is?$A"

=================》》》》》》》》》》》

測(cè)試結(jié)果:

[root@node2 ~]$ ./1.sh fork

PID for 1.sh before exec/source/fork:10175

1.sh: $A is B

using fork by default...

PID for 2.sh:?10176

2.sh get $A=B from 1.sh

2.sh: $A is C

PID for 1.sh after exec/source/fork:10175

1.sh: $A is B

=============================================

[root@node2 ~]$ ./1.sh source

PID for 1.sh before exec/source/fork:10185

1.sh: $A is B

using source...

PID for 2.sh:?10185

2.sh get $A=B from 1.sh

2.sh: $A is C

PID for 1.sh after exec/source/fork:10185

1.sh: $A is C

=============================================

[root@node2 ~]$ ./1.sh exec

PID for 1.sh before exec/source/fork:10194

1.sh: $A is B

using exec...

PID for 2.sh:?10194

2.sh get $A=B from 1.sh

2.sh: $A is C

[cpsuser@cps-svr-153 zy]$

=============================================

從以上結(jié)果可以看出:

1.執(zhí)行source和exec的過程中沒有產(chǎn)生新的進(jìn)程,而fork是默認(rèn)的運(yùn)行方式,在運(yùn)行的過程中會(huì)產(chǎn)生新的進(jìn)程,也就是子進(jìn)程

2.source和exec的區(qū)別在于exec執(zhí)行完畢后沒有輸出進(jìn)程,也就是說運(yùn)行完畢2.sh后直接退出了,沒有返回1.sh

3.fork和source的最后一句輸出分別為:1.sh: $A is B (fork,說明它運(yùn)行的環(huán)境不一樣,要不然輸出的應(yīng)該是C)

1.sh: $A is C(source,說明從始至終都是在一個(gè)shell中執(zhí)行)

小節(jié):

source 指定腳本中的命令在同一個(gè)shell中運(yùn)行。(默認(rèn)shell中的命令都是創(chuàng)建sub-shell,然后執(zhí)行。執(zhí)行完后,返回父shell)

fork 就是創(chuàng)建sub-shell運(yùn)行腳本中的命令,和默認(rèn)運(yùn)行方式相同。

exec 和source相似,區(qū)別就是,運(yùn)行完畢命令后退出,不會(huì)返回父shell

linux中的fork函數(shù)到底做了什么事

額........每啟動(dòng)一個(gè)進(jìn)程并不一定要執(zhí)行fork.fork只是系統(tǒng)最后封裝的一個(gè)系統(tǒng)調(diào)用.你在程序里不使用fork的話.使用其它方式啟動(dòng)進(jìn)程.就不是fork.fork族里有很多函數(shù)...............exec也可替換當(dāng)前進(jìn)程......系統(tǒng)內(nèi)核里生成一個(gè)進(jìn)程用的是clone這個(gè)函數(shù).

就比如要蓋個(gè)房子.一個(gè)人干,要先挖土再調(diào)水泥再擺磚頭再蓋墻這樣一步一步做.但是如果有多個(gè)人.就是可以多個(gè)人同時(shí)做這些事,一個(gè)挖土,一個(gè)調(diào)水泥.一個(gè)擺磚頭.這樣就省了很多時(shí)間.進(jìn)程也是如此.fork的作用就是創(chuàng)建新進(jìn)程.

這么多人一起蓋房子,總不能各自蓋各自的,需要大家協(xié)調(diào)來做.不能土沒挖好就擺磚,沒放磚就抹水泥一樣.這個(gè)時(shí)候需要一個(gè)工頭來管理大家.工頭通過每個(gè)人的名字來指揮每個(gè)人干活.進(jìn)程就通過pid來指揮一個(gè)進(jìn)程干活.工人需要知道自己的工頭是誰,好向他報(bào)告碰到的情況.進(jìn)程需要知道自己的父進(jìn)程是誰報(bào)告自己的情況.

這樣就明白fork為何要返回進(jìn)程的id了吧?fork是不會(huì)返回父進(jìn)程的id的.

工頭找了一個(gè)新工人干活.從工頭知道這個(gè)新工人的名字時(shí)刻開始,新工人就會(huì)投入這個(gè)團(tuán)隊(duì)一起干活了.fork返回pid的時(shí)候就表示這個(gè)進(jìn)程在這個(gè)進(jìn)程團(tuán)隊(duì)里了.工頭可以直接告訴工人要干什么而不會(huì)讓其他工人誤以為這是自己的活.但是程序并沒有這么智能.這個(gè)時(shí)候就需要有一個(gè)狀態(tài)(if(!pid){....這是工人干的活...})表明這個(gè)工人的代碼從什么位置開始,到什么位置結(jié)束.

關(guān)于Linux的fork()?

= OR ==

你初學(xué)者吧,請(qǐng)把賦值 =

和 == 值比較 搞清楚啊

= value assignment

== value compare

名稱欄目:linux的fork命令,linux中fork函數(shù)詳解原創(chuàng)!!實(shí)例講解
分享鏈接:http://jinyejixie.com/article2/hsoioc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、外貿(mào)建站、小程序開發(fā)微信小程序、品牌網(wǎng)站設(shè)計(jì)建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)
曲阳县| 通海县| 玛曲县| 六盘水市| 靖宇县| 澄江县| 平泉县| 彰化市| 宕昌县| 十堰市| 乌海市| 宽甸| 祁东县| 莱西市| 晋城| 棋牌| 百色市| 三门县| 巴楚县| 嘉定区| 台湾省| 茶陵县| 化隆| 新化县| 大邑县| 依安县| 招远市| 体育| 逊克县| 仁寿县| 大关县| 长海县| 芦溪县| 治县。| 新宁县| 常宁市| 姚安县| 永济市| 兴海县| 仲巴县| 兴文县|