2012-04-01 43 views
5

我有一個結構:如何修改C中的共享內存(shmget/shmat)?

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

我創建的結構共享內存如下:

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

然後我訪問共享內存這樣的:

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

我的問題是很簡單。這是訪問/修改共享內存的正確方式嗎?這是最好的方法嗎?

(我用的同步系統V信號,我還沒有列入該代碼。我只是想確保我訪問/修改共享內存正確。)

回答

2

這是正確的,唯一值得注意的是你正在創建一個PRIVATE共享內存段,這意味着你必須以某種方式將shmid傳輸到你想要使用它的任何其他進程。

+1

如果另一個進程是'fork()',那麼只要在fork()之前創建共享內存,IPC_PRIVATE就沒有問題。不過,這個警告在更一般的情況下是有效的。 – 2012-04-01 19:46:10

4

是的,這是一種方法,創建,然後訪問或修改該共享內存。 但是,您可能會遇到同步問題,您可以使用例如Posix的信號量。首先查看sem_overview(7)手冊頁。

+0

謝謝。我對同步很好。我只是擔心做「data-> time = time(null);或者data-> x = 5」而且它搞砸了一些東西。 – bfresh 2012-04-01 19:16:00