go語(yǔ)言之父視頻 go語(yǔ)言是誰(shuí)發(fā)明的

golang 進(jìn)程創(chuàng)建,fork,以及熱重啟(無(wú)縫升級(jí))

一般來(lái)說(shuō),進(jìn)程的操作使用的是一些系統(tǒng)的命令,所以go內(nèi)部使用os包,進(jìn)行一些運(yùn)行系統(tǒng)命令的操作

創(chuàng)新互聯(lián)是專業(yè)的龍城網(wǎng)站建設(shè)公司,龍城接單;提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行龍城網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

os 包及其子包 os/exec 提供了創(chuàng)建進(jìn)程的方法。

一般的,應(yīng)該優(yōu)先使用 os/exec 包。因?yàn)?os/exec 包依賴 os 包中關(guān)鍵創(chuàng)建進(jìn)程的 API,為了便于理解,我們先探討 os 包中和進(jìn)程相關(guān)的部分。

Unix :fork創(chuàng)建一個(gè)進(jìn)程,(及其一些變種,如 vfork、clone)。

Go:Linux 下創(chuàng)建進(jìn)程使用的系統(tǒng)調(diào)用是 clone。

允許一進(jìn)程(父進(jìn)程)創(chuàng)建一新進(jìn)程(子進(jìn)程)。具體做法是,新的子進(jìn)程幾近于對(duì)父進(jìn)程的翻版:子進(jìn)程獲得父進(jìn)程的棧、數(shù)據(jù)段、堆和執(zhí)行文本段的拷貝??蓪⒋艘暈榘迅高M(jìn)程一分為二。

終止一進(jìn)程,將進(jìn)程占用的所有資源(內(nèi)存、文件描述符等)歸還內(nèi)核,交其進(jìn)行再次分配。參數(shù) status 為一整型變量,表示進(jìn)程的退出狀態(tài)。父進(jìn)程可使用系統(tǒng)調(diào)用 wait() 來(lái)獲取該狀態(tài)。

目的有二:其一,如果子進(jìn)程尚未調(diào)用 exit() 終止,那么 wait 會(huì)掛起父進(jìn)程直至子進(jìn)程終止;其二,子進(jìn)程的終止?fàn)顟B(tài)通過(guò) wait 的 status 參數(shù)返回。

加載一個(gè)新程序(路徑名為 pathname,參數(shù)列表為 argv,環(huán)境變量列表為 envp)到當(dāng)前進(jìn)程的內(nèi)存。這將丟棄現(xiàn)存的程序文本段,并為新程序重新創(chuàng)建棧、數(shù)據(jù)段以及堆。通常將這一動(dòng)作稱為執(zhí)行一個(gè)新程序。

沒(méi)有直接提供 fork 系統(tǒng)調(diào)用的封裝,而是將 fork 和 execve 合二為一,提供了 syscall.ForkExec。如果想只調(diào)用 fork,得自己通過(guò) syscall.Syscall(syscall.SYS_FORK, 0, 0, 0) 實(shí)現(xiàn)。

os.Process 存儲(chǔ)了通過(guò) StartProcess 創(chuàng)建的進(jìn)程的相關(guān)信息。

一般通過(guò) StartProcess 創(chuàng)建 Process 的實(shí)例,函數(shù)聲明如下:

它使用提供的程序名、命令行參數(shù)、屬性開(kāi)始一個(gè)新進(jìn)程。StartProcess 是一個(gè)低級(jí)別的接口。os/exec 包提供了高級(jí)別的接口,一般應(yīng)該盡量使用 os/exec 包。如果出錯(cuò),錯(cuò)誤的類型會(huì)是 *PathError。

屬性定義如下:

FindProcess 可以通過(guò) pid 查找一個(gè)運(yùn)行中的進(jìn)程。該函數(shù)返回的 Process 對(duì)象可以用于獲取關(guān)于底層操作系統(tǒng)進(jìn)程的信息。在 Unix 系統(tǒng)中,此函數(shù)總是成功,即使 pid 對(duì)應(yīng)的進(jìn)程不存在。

Process 提供了四個(gè)方法:Kill、Signal、Wait 和 Release。其中 Kill 和 Signal 跟信號(hào)相關(guān),而 Kill 實(shí)際上就是調(diào)用 Signal,發(fā)送了 SIGKILL 信號(hào),強(qiáng)制進(jìn)程退出,關(guān)于信號(hào),后續(xù)章節(jié)會(huì)專門(mén)講解。

Release 方法用于釋放 Process 對(duì)象相關(guān)的資源,以便將來(lái)可以被再使用。該方法只有在確定沒(méi)有調(diào)用 Wait 時(shí)才需要調(diào)用。Unix 中,該方法的內(nèi)部實(shí)現(xiàn)只是將 Process 的 pid 置為 -1。

通過(guò) os 包可以做到運(yùn)行外部命令,如前面的例子。不過(guò),Go 標(biāo)準(zhǔn)庫(kù)為我們封裝了更好用的包: os/exec,運(yùn)行外部命令,應(yīng)該優(yōu)先使用它,它包裝了 os.StartProcess 函數(shù)以便更容易的重定向標(biāo)準(zhǔn)輸入和輸出,使用管道連接 I/O,以及作其它的一些調(diào)整。

exec.LookPath 函數(shù)在 PATH 指定目錄中搜索可執(zhí)行程序,如 file 中有 /,則只在當(dāng)前目錄搜索。該函數(shù)返回完整路徑或相對(duì)于當(dāng)前路徑的一個(gè)相對(duì)路徑。

func LookPath(file string) (string, error)

如果在 PATH 中沒(méi)有找到可執(zhí)行文件,則返回 exec.ErrNotFound。

Cmd 結(jié)構(gòu)代表一個(gè)正在準(zhǔn)備或者在執(zhí)行中的外部命令,調(diào)用了 Run、Output 或 CombinedOutput 后,Cmd 實(shí)例不能被重用。

一般的,應(yīng)該通過(guò) exec.Command 函數(shù)產(chǎn)生 Cmd 實(shí)例:

用法

得到 * Cmd 實(shí)例后,接下來(lái)一般有兩種寫(xiě)法:

前面講到,通過(guò) Cmd 實(shí)例后,有兩種方式運(yùn)行命令。有時(shí)候,我們不只是簡(jiǎn)單的運(yùn)行命令,還希望能控制命令的輸入和輸出。通過(guò)上面的 API 介紹,控制輸入輸出有幾種方法:

參考資料:

golang父進(jìn)程通過(guò)管道向子進(jìn)程傳遞數(shù)據(jù)

golang父進(jìn)程通過(guò)管道向子進(jìn)程傳遞數(shù)據(jù)

這里例子里面父進(jìn)程launch一個(gè)子進(jìn)程,然后通過(guò)管道(stdin)向子進(jìn)程傳遞文本串。

父進(jìn)程:

子進(jìn)程:

Golang如何讓子進(jìn)程以另一個(gè)用戶身份運(yùn)行

Golang如何讓子進(jìn)程以另一個(gè)用戶身份運(yùn)行

當(dāng)父進(jìn)程launch一個(gè)子進(jìn)程的時(shí)候,如何使得子進(jìn)程使用另一個(gè)用戶身份運(yùn)行。

前提條件當(dāng)前用戶得用足夠的權(quán)限切換到另一個(gè)用戶,所以通常父進(jìn)程是root。

下面的例子是root用戶的父進(jìn)程,如何launch一個(gè)子進(jìn)程,并且使得子進(jìn)程以nobody的身份在運(yùn)行(nobody是*nix操作系統(tǒng)的內(nèi)置賬號(hào))。

其中關(guān)鍵的命令就是兩行

先查找到nobody用戶的uid和gid,然后調(diào)用syscall.Credential對(duì)象。

注意上述的操作都需要特權(quán),通常只有root用戶才有這個(gè)權(quán)限。

Golang棄用go get工具

由于golang發(fā)布了新版本1.17.1,你可能會(huì)在使用go get -u安裝包時(shí)得到這個(gè)錯(cuò)誤。

例如:在安裝goose包時(shí)使用:

返回如下錯(cuò)誤:

go get在g.mod中同時(shí)用于更新依賴和安裝命令。這種組合很混亂,使用起來(lái)也很不方便,因?yàn)殚_(kāi)發(fā)人員不想同時(shí)進(jìn)行更新和安裝。

隨著1.17.1版本的發(fā)布不再支持go get命令。那么以后如何安裝依賴包呢?

1、根據(jù)文檔,如果要在當(dāng)前模塊的上下文中安裝可執(zhí)行文件時(shí),使用go install不帶版本后綴。如下所示:

這個(gè)命令適用于安裝當(dāng)前目錄或父目錄中g(shù)o.mod定義的版本要求和其他命令。

2、要安裝可執(zhí)行文件同時(shí)忽略當(dāng)前模塊go.mod,使用go install帶上版本后綴例如:@v1.2.3 或@latest

因此變化在于:使用install替換get,去除-u在包URL末尾添加@latest?;蛘邔?duì)于舊版本不是最新版本情況,在包URL的末尾添加指定版本。

現(xiàn)在可以成功安裝。

網(wǎng)頁(yè)名稱:go語(yǔ)言之父視頻 go語(yǔ)言是誰(shuí)發(fā)明的
分享鏈接:http://www.bm7419.com/article10/dohhpgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、微信公眾號(hào)、企業(yè)網(wǎng)站制作、面包屑導(dǎo)航、網(wǎng)站建設(shè)網(wǎng)站制作

廣告

聲明:本網(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司