操作系統包及其子包os/exec提供了創建進程的方法。
通常,應該首先使用os/exec包。由於os/exec包依賴於os包中密鑰創建過程的API,為了便於理解,我們先討論os包中與該過程相關的部分。
Unix :fork創建壹個進程(及其壹些變體,如vfork和clone)。
Go:用於在Go:Linux下創建進程的系統調用是clone。
允許壹個進程(父進程)創建壹個新進程(子進程)。具體來說,新的子進程幾乎是父進程的副本:子進程獲得父進程的堆棧、數據段、堆和執行文本段的副本。請將此視為將父進程壹分為二。
終止進程並返回所有資源(內存、文件描述符等)。)被進程占用到內核進行重新分配。參數status是壹個整數變量,表示進程的退出狀態。父進程可以使用系統調用wait()來獲取狀態。
有兩個目的:第壹,如果子進程沒有調用exit()終止,那麽wait將掛起父進程,直到子進程終止;其次,通過wait的status參數返回子流程的終止狀態。
將新程序(路徑名、參數列表argv、環境變量列表envp)加載到當前進程的內存中。這將丟棄現有的程序文本段,並為新程序重新創建堆棧、數據段和堆。這個動作通常被稱為執行新程序。
不是直接提供fork系統調用的封裝,而是將fork和executiveare結合起來提供syscall.ForkExec .如果您只想調用fork,則必須通過syscall自己完成。syscall(系統調用。sys _ fork,0,0,0。
Os。Process存儲有關StartProcess創建的進程的信息。
壹般情況下,Process的實例是由StartProcess創建的,函數聲明如下:
它使用提供的程序名、命令行參數和屬性啟動壹個新進程。StartProcess是壹個低級接口。os/exec包提供了壹個高級接口,因此應盡可能多地使用os/exec包。如果有錯誤,錯誤的類型將是*PathError。
屬性定義如下:
FindProcess可以通過pid找到正在運行的進程。此函數返回的進程對象可用於獲取有關底層操作系統進程的信息。在Unix系統中,即使pid對應的進程不存在,該函數也總是成功。
進程提供了四種方法:終止、信號、等待和釋放。其中,Kill和signal與信號有關,Kill實際上是調用Signal並發送SIGKILL信號以強制進程退出。以下章節將具體解釋這些信號。
釋演法用於釋放與流程對象相關的資源,以便將來可以重用這些資源。只有在確定沒有調用Wait時,才需要調用此方法。在Unix中,該方法的內部實現僅將進程的pid設置為-1。
您可以通過操作系統包運行外部命令,如上例所示。然而,Go標準庫為我們封裝了壹個更好的包:os/exec,在運行外部命令時應該首先使用它。它封裝了操作系統。StartProcess函數更容易地重定向標準輸入和輸出,使用管道連接I/O,並進行其他調整。
高管。LookPath函數在Path指定的目錄中搜索可執行程序。如果文件中有/文件,它只在當前目錄中搜索。該函數返回當前路徑的完整路徑或相對路徑。
func LookPath(文件字符串)(字符串,錯誤)
如果在路徑中找不到可執行文件,它將返回exec.ErrNotFound。
Cmd結構表示正在準備或執行的外部命令。調用Run、Output或CombinedOutput後,Cmd實例無法重用。
通常,Cmd實例應該通過exec生成。命令功能:
使用
獲得* Cmd實例後,通常有兩種方法來編寫它:
如前所述,有兩種方法可以在傳遞Cmd實例後運行命令。有時,我們不只是運行命令,還希望控制命令的輸入和輸出。通過上面的API介紹,有幾種方法可以控制輸入和輸出:
參考資料:
/The-Golang-Standard-Library-by-Example/chapter 10/10.1 . html