簡體   English   中英

C靜態變量和linux fork

[英]C static variables and linux fork

嗨,我創建了一個服務器程序,該程序在接受套接字連接后派生一個新進程。 程序中定義了幾個靜態分配的全局變量。 我的問題是在派生后是否兩次分配了這些靜態緩沖區? 還是fork只復制堆和調用堆棧上的地址空間?

整個地址空間都是重復的,包括所有全局變量和程序文本。

fork(2)期間,整個地址空間被“復制”。 它通常是通過復制完成的,並且有更多有關共享程序文本和庫的詳細信息,但這與此處無關。 父進程和子進程最終都擁有自己的靜態數據副本。

fork()復制整個過程映像。 所有的。 因此,它們分配了兩次...不,每個可執行映像現在分配了兩次,不,如果您在父級中引用一個,則不會包含與父映像相同的內容。除非您使用共享內存。

static ,該關鍵字表示此含義(來自ISO C99):

通過外部或內部鏈接或存儲類說明符static聲明其標識符的對象的靜態存儲持續時間。 它的生命周期是程序的整個執行過程,並且在程序啟動之前,它的存儲值僅初始化一次。

這基本上意味着您的緩沖區將作為CRT啟動例程的一部分進行一次初始化,並且該空間僅在您退出時消失。 在這種情況下,每個孩子退出時該存儲空間都會消失。

Linux使用稱為寫時復制的機制。 這基本上意味着,只要不修改變量,父級和新進程就會共享一個變量。 但是在修改變量之前,先將其復制,然后新過程將使用復制。 出於性能原因完成此操作,該技術稱為延遲優化。 因此,您不必擔心在一個過程中更改變量會在另一個過程中更改它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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