Shell
程序未由終端啟動時的 IO 和其他 shell 命令
我的桌面上有幾個用於各種程序的啟動器,並且這些啟動器有一個“在終端中執行”設置。
當我檢查該設置時,程序從終端執行,並在那裡記錄其輸出。我想它也可以
stdin
從終端讀取。但是:當程序不是由終端執行時,IO 會發生什麼?另外,當我從這樣的程序執行系統(shell)命令時會發生什麼?
是否有執行這些程序的“後台”外殼?還是每個程序都有它的外殼,通過它與系統的其餘部分互動?
當一個程序啟動時(通過
exec(3)
系統呼叫家族之一),它繼承環境(即,shell 變數export
ed)和來自父級的打開文件。啟動程序時所做的是fork(2)
,孩子設置環境和文件,然後exec(3)
是新程序。當 shell 執行此操作時,STDIN、STDOUT 和 STDERR 連接到終端。任何圖形啟動器都取決於它,但應該將它們連接到/dev/null
(鍵盤輸入應該從哪裡來,輸出應該去哪裡?)。如果像這樣啟動的程序又呼叫
exec(3)
,則如上所述。system(3)
有點複雜,因為它會生成一個 shell 來進行命令行解析等等,然後那個 shellexec(3)
就是命令。但機制是相同的:文件是繼承的,環境也是如此。