Tôi bị nhầm lẫn bởi linux man pages
cho shmctl()
. Tôi sử dụng lệnh sau: shmctl (id , IPC_RMID , 0)
để xóa phân đoạn được chia sẻ. man pages
dường như mâu thuẫn với tuổi thọ của bộ nhớ.Xóa phân đoạn bộ nhớ chia sẻ với shmctl
Tình trạng man pages:
IPC_RMID
Đánh dấu phân khúc bị phá hủy. Phân đoạn này sẽ chỉ thực sự bị phá hủy sau khi quá trình cuối cùng phá hủy nó (tức là khi thành viên shm_nattch shmidattch của cấu trúc liên kết là số không). Người gọi phải là chủ sở hữu hoặc người sáng tạo hoặc được đặc quyền. Nếu một đoạn đã được đánh dấu để hủy, thì cờ SHM_DEST (không chuẩn) của trường shm_perm.mode trong cấu trúc dữ liệu được liên kết được truy xuất bởi IPC_STAT sẽ được đặt.
Nếu tôi đúng, tôi tin rằng điều này có nghĩa nếu bạn có hai quá trình mà cả hai gắn với bộ nhớ chia sẻ, (Cho phép gọi họ Process1
và Process2
), Process1
có thể tạo ra các bộ nhớ chia sẻ, đính kèm, tách, phá hủy các chia sẻ bộ nhớ, và cuối cùng chấm dứt. Sau đó, bộ nhớ sẽ vẫn tồn tại cho đến khi Process2
cũng bị gián đoạn.
Điều này có đúng không?
Thứ hai, những gì hiện tuyên bố này trong man pages
có nghĩa là:
Người gọi phải đảm bảo rằng một phân khúc được cuối cùng bị phá hủy; nếu không trang của nó đã bị lỗi sẽ vẫn còn trong bộ nhớ hoặc trao đổi.
Điều này làm cho nó có vẻ như Process1
, vì nó đánh dấu phân đoạn để xóa, sẽ cần chặn cho đến khi tất cả các quy trình khác được tách ra để đảm bảo bộ nhớ bị xóa. Nhưng điều này dường như mâu thuẫn với tuyên bố trên. Tôi cũng không có ý tưởng làm thế nào điều này sẽ được thực hiện (nếu nó là nghĩa vụ phải được thực hiện), vì vậy nếu đó là trường hợp, bạn có thể cũng giải thích làm thế nào tôi sẽ đi về việc này.