Cygwin 子進程在 fork 後透過 child_info_fork::handle_fork 初始化,首要任務為 cygheap_fixup_in_child,負責將父進程的 cygheap 記憶體區域完整複製到子進程對應位址。
void __stdcall cygheap_fixup_in_child(bool execed) {
cygheap_max = child_proc_info->cygheap;
cygheap = (init_cygheap*) cygheap_max;
_csbrk((char*)child_proc_info->cygheap_max - (char*)cygheap);
child_copy(child_proc_info->parent, false, "cygheap", cygheap, cygheap_max, NULL);
cygheap_init();
debug_fixup_after_fork_exec();
if (execed) { /* 清理孤立記憶體 */ }
}
child_proc_info 由父進程 CreateProcess 傳遞,含 cygheap 範圍。_csbrk 擴展資料段至父進程 cygheap_max。child_copy 將父進程 [cygheap, cygheap_max) 內容複製到子進程同位址。cygheap_init 初始化鎖、檔案描述符表、訊號處理;因記憶體已複製,主要執行 cygheap_protect.init。execed=false 時提前返回,不執行 exec 專用清理邏輯。此機制確保子進程擁有與父進程一致的堆狀態,支援 fork 語意下的記憶體隔離與共享。