簡體   English   中英

當我從C中的一個分叉的孩子執行exec()時會發生什么

[英]what happens when I exec() from a forked child in c

假設我有進程foo和可執行文件bar。 foo調用fork(),現在我有兩個,將它們稱為foo_parent和foo_child。

  • foo_parent調用wait()
  • foo_child調用execvp([stuff to run bar]);

我不太了解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_childbar許多其他屬性相同,但是該可執行文件是重新啟動的。 進程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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM