要執行一個簡單命令 shell 首先復制自身,然后 shell 等待實際上執行命令的 subshell (子shell)完成,在 subshell 中做重定向和執行 exec 系統調用,用指定程序的代碼段和數據段替代 shell 代碼段和數據段,進程 id 等元信息不變。
管道線 a | b 執行:shell 創建一個管道,復制一個 subshell, 在其中把輸出標準重定向到管道寫端然后 exec a,shell 不等待這個 subshell 執行完成; shell 接著復制一個 subshell,在其中把標準輸入重定向到管道讀端然后 exec b, shell 等待它這個 subshell 完成。
在 (...) 方式執行命令時候涉及到進一步的進程復制,shell 在復制 subshell 之后不等待其完成;subshell 在執行除了最后一個命令之外所有命令的時候都復制一個 subsubshell,在其中做重定向和 exec, subshell 在自身中重定向和 exec 最后一個命令. 如果管道由 subshell( exec a) 創建,那么subshell(exec b)就無法通過繼承得到該管道描述符,從而進行重定向,那么只能使用使用named pipe了?
from:linuxforum
posted on 2010-02-13 23:42
chatler 閱讀(689)
評論(0) 編輯 收藏 引用 所屬分類:
Shell