2012-04-01 24 views
5

Tôi có một struct:Làm thế nào để sửa đổi bộ nhớ chia sẻ (shmget/shmat) trong C?

struct sdata { 
    int x; 
    int y; 
    time_t time; 
}; 

tôi có thể tạo bộ nhớ chia sẻ cho các cấu trúc như sau:

size_t shmsize = sizeof(struct sdata); 
shmid = shmget(IPC_PRIVATE, shmsize, IPC_CREAT | 0666); 

Sau đó, tôi truy cập vào bộ nhớ chia sẻ như thế này:

struct sdata *data = shmat(shared.shmid, (void *) 0, 0); 
data->time = time(NULL); // function returns the current time 

Câu hỏi của tôi là khá đơn giản. Đây có phải là cách đúng để truy cập/sửa đổi bộ nhớ dùng chung không? Đây có phải là cách tiếp cận tốt nhất không?

(Tôi đang sử dụng semaphores System V để đồng bộ hóa và tôi đã không bao gồm mã mà. Tôi chỉ muốn chắc chắn rằng tôi đang truy cập/sửa đổi các bộ nhớ chia sẻ một cách chính xác.)

Trả lời

2

Điều này là đúng, điều duy nhất cần lưu ý là bạn đang tạo phân đoạn bộ nhớ chia sẻ RIÊNG, có nghĩa là bạn sẽ phải chuyển shmid bằng cách nào đó sang bất kỳ quy trình nào khác mà bạn muốn sử dụng.

+1

Nếu quá trình khác là 'fork()' ed, thì không có vấn đề gì với IPC_PRIVATE, miễn là bộ nhớ dùng chung được tạo trước 'fork()'. Tuy nhiên, caveat là hợp lệ trong trường hợp tổng quát hơn. –

4

Vâng, đó là một cách để tạo, sau đó truy cập hoặc sửa đổi bộ nhớ dùng chung đó. Tuy nhiên, bạn có thể gặp vấn đề về đồng bộ hóa và bạn có thể sử dụng ví dụ: Posix semaphores cho điều đó. Xem trang đầu tiên sem_overview(7).

+0

cảm ơn. tôi ổn với việc đồng bộ hóa. tôi đã chỉ lo lắng về việc làm "data-> time = time (null); hoặc data-> x = 5" và nó làm rối tung điều gì đó. – bfresh

Các vấn đề liên quan