![](/img/trans.png)
[英]What happens to the child process, when the parent process calls an exec command
[英]what happens when I exec() from a forked child in c
假設我有進程foo和可執行文件bar。 foo調用fork(),現在我有兩個,將它們稱為foo_parent和foo_child。
我不太了解foo_child / bar會發生什么。 foo_child是否在內存中被bar覆蓋? 是否啟動了新的bar進程並賦予了foo_child的pid? bar是foo_child的子級,foo_child只是將返回值傳遞給foo_parent嗎?
我知道當foo_parent在等待后獲得退出狀態時,這是bar的exit()調用的結果,但我對“幕后”的情況一無所知。
整個過程被foo_child
替換為bar
。 它具有相同的PID,並且foo_child
和bar
許多其他屬性相同,但是該可執行文件是重新啟動的。 進程bar
仍然是foo_parent
的子foo_parent
,因此foo_parent
可以獲得其退出狀態,依此foo_parent
。
請注意,如果exec*()
成功, exec*()
系列函數將永遠不會返回。 如果他們回來了,那就失敗了。
“ foo調用fork(),現在有兩個,分別稱為foo_parent和foo_child。”
減少混亂:您仍然擁有進程foo(父進程),現在還有子進程(foo_child)。
“ foo是否在內存中被bar覆蓋?”
當foo_child調用exec()時,其內存空間將被bar的內存空間覆蓋。 它保留了foo中的某些內容。 特別是,在foo中打開的文件描述符(而不是非執行時關閉的文件描述符)仍在bar中打開,並且它還繼承了foo的一些信號處理方式(有關詳細信息,請咨詢exec *的手冊頁)。
“是否啟動了一個新的酒吧程序並賦予了foo_child的pid?”
Sorta,不是。 當您分叉時,具有自己的pid和內存空間的新進程foo_child開始。 在派生時,它具有foo的內存空間副本。 當它調用exec(bar)時,其內存空間將被bar覆蓋,並運行bar而不是foo的可執行代碼。
“ bar的foo_child的子級和foo_child只是將返回值傳遞給foo_parent嗎?”
不,bar(即-現在正在執行bar的foo_child)是foo的子進程,其退出值可以返回給foo。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.