2012-12-18 36 views
3

我使用shmget,shmatshmctl分別獲取並創建共享內存段,將其附加到進程地址空間中並將其刪除。乾淨地銷燬系統V共享內存段

我想知道如果進程仍然可以使用共享內存段,即使它已經被拆卸並在一個過程中使用

shmctl(id, IPC_RMID, ...) 

要求拆除。

我無法從該名男子頁得到的信息:

IPC_RMID標記段被破壞。該段只會在最後一個進程分離後才被實際銷燬(即shm_nattch關聯結構的成員shmid_ds爲零)。來電者必須是所有者或創作者,或享有特權。如果段已標記爲銷燬,則將設置由IPC_STAT檢索的關聯數據結構中的(非標準)字段的標誌。

+4

即使您仍然可以使用它,您如何知道其他進程在您使用它時不會分離(並因此銷燬)該段? –

+0

@FrédéricHamidi我不明白你的意見。這是否意味着答案是肯定的?你能解釋一下嗎? –

+0

答案是肯定的,如果請求銷燬的進程沒有將細分後來分離,但是從你的問題看,你已經知道了。所以我假設你想知道在請求銷燬和分離之後,是否仍然可以使用'shmat()'映射的地址。因此,我的評論。 –

回答

1

在Linux上,可以附加共享內存段,即使它已被標記爲刪除。但是,POSIX.1-2001沒有指定這種行爲,許多其他實現不支持它。