2012-02-14 32 views
0

我正在寫家庭作業的HTTP服務器,我想確保我正確地使用共享內存。下面是相關的東西摘要:叉子共享引用和清理內存進程

struct my_struct{ 
    int num_kids; 
    ... 
} 

int main(arg stuff){ 
    ... 
    struct mystruct *shared_data; 
    // shmget & shmat here 
    shared_data = (struct mystruct *) shared_memory; 
    ... 
    while(mainloop){ 
    ... 
    if(incoming_connection) 
     if(!fork()) 
     childstuff(shared_data); 
    } 
    ... 
    while(shared_data->num_kids > 0) 
    sleep(1); 
    // shmdt & shmctl here 
} 

void childstuff(struct mystruct *shared){ 
    shared->num_kids++; 
    ... 
    shared->num_kids--; 
    exit(0); 
} 

問題

1)將childstuff()能夠正確地訪問共享內存?

2)我需要調用shmdt()的孩子?

3)將調用在孩子亂了共享內存的exit(),而不是_exit()?我知道exit()在調用_exit()之前會清理一些_exit()不會調用的東西,但我不確定exit()會清除多餘的東西(除了刷新I/O緩衝區之外)。

+0

您應該只在子進程中調用_exit()。每個main應該至多有一個exit()調用,並且這幾乎總是發生在父進程中。 – rasmus 2012-02-14 21:43:51

+0

所以絕對在孩子中使用_exit()而不是exit()?好的,謝謝rasmus。 – 2012-02-14 22:41:57

+0

沒錯。如果你想了解更多信息,請看[這裏](http://www.unixguide.net/unix/programming/1.1.3.shtml)。 – rasmus 2012-02-14 22:52:03

回答

0

我的理解是,在現代操作系統調用exit導致進程結束和內存分配給線程池將被取消分配。但是,這是清理內存使用的一種非常草率的方式,真的不應該被忽視,因爲有很多事情會中斷和終止進程,更不用說內存不足的明顯潛在問題。

這是OOP可以進來非常方便,但我認爲,因爲這是你堅持用C寫它一個家庭作業?

我會編寫實現某些類型(例如,鏈接列表)管理的分配和共享存儲器的解除分配的一個列表中的新模塊。該模塊需要一些公開的API來分配內存和釋放內存。 (想想:mallocfree的包裝函數)。它還需要一個鎖定機制來強制單一訪問,以便兩個進程不會彼此停止。