Shell

一個程序可以在沒有 shell 作為中間體的情況下執行另一個程序嗎?

  • May 5, 2021

這可能是一個愚蠢的問題。為 Linux 編寫的程序(例如用 Golang 編寫的程序)可以呼叫系統呼叫直接執行另一個程序,還是必須先呼叫 shell 並讓它執行另一個程序?我並不是說要替換目前的程序。假設我有program1一個 Web 伺服器並且不斷執行,它可以program2通過直接訪問核心並使用相關的系統呼叫來執行,還是先通過 shell?如果它不使用外殼,是否有特定情況下您必須在程序中使用外殼來做一些事情?如果是這樣,那會是什麼?將不勝感激任何資訊。

我可以在不使用 shell 作為中介的情況下執行程序嗎?

是的:與啟動 shell 的方式完全相同。

使用exec: 但這會替換目前程序。

使用fork: 創建一個新程序,然後exec替換它。shell 還使用了其他有用的系統呼叫。pipe: 做管子。dup:將管道連接到stdinstdout

通常有更高級別的庫來執行此操作。這些允許您的程式碼在其他作業系統(例如 Microsoft 的 Windows)上工作。他們將結合這些系統呼叫中的幾個(例如,合成一個create_process呼叫)。

看起來分叉一個程序然後替換它會很慢。它不是。它比在 MS-Windows 上創建執行緒要快。fork非常高效:它推遲了大部分工作,因此通常不需要這樣做。

從另一個執行程序時,是否有任何時候我必須使用 shell?

僅當它是一個 shell 腳本時。但是,您可能希望使用它的服務:globing、redirection 等。我認為 golang 有足夠好的庫來執行此操作,因此您不需要 shell。

引用自:https://unix.stackexchange.com/questions/647583