C

為什麼 vfork 或 fork 的孩子應該呼叫 _exit() 而不是 exit()?

  • August 17, 2013

從手冊頁vfork()

vfork() 與 fork() 的不同之處在於父程序被掛起,直到子程序呼叫 execve(2) 或 _exit(2)。子程序與其父程序共享所有記憶體,包括堆棧,直到子程序發出 execve()。子程序不能從目前函式返回或呼叫exit(),但可以呼叫_exit()。

為什麼孩子應該使用 an_exit()而不是簡單的 call exit()?我希望這適用於vfork()fork()

如前所述vfork不允許子程序訪問父程序的記憶體。exit是一個 C 庫函式(這就是為什麼它經常寫成exit(3)。它執行各種清理任務,例如刷新和關閉 C 流(通過在 中聲明的函式打開的文件stdio.h)和執行在atexit. 所有這些任務都涉及到程序記憶體的讀取和寫入。

_exit沒有清理就退出。它直接是一個系統呼叫(這​​就是它被寫為 的原因_exit(2)),通常通過將系統呼叫號放在處理器寄存器中並執行特定的處理器指令(分支到系統呼叫處理程序)來實現。這不需要訪問程序記憶體,所以在vfork.

之後fork,就沒有這樣的限制了:父子程序現在是完全自治的。

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