如果我有一些结构
struct processData{
int *a;
int *b;
}
然后我将我的共享内存 ID 设置为
int shmid = shmget(1234, sizeof(processData), IPC_CREAT | 0666);
1234 是我的 key
我会像这样设置我的实际共享结构吗..
processData* pData =(processData *) shmat(shmid, NULL, 0);
然后我不应该能够在单独的过程中改变周围的东西,比如:
pData -> a = SOME_NUMBER;
当我这样做时,我的所有进程都没有与同一 block 内存交互,我不知道为什么。
最佳答案
结构processData
中的成员*a
和*b
是整数指针类型。将共享内存附加到您的进程不会使它们指向共享内存内的内存位置。其次,您首先使用 shmget()
函数创建的共享内存只有足够的空间来容纳 processData
数据类型。您将需要一些额外的内存空间来保存两个 int
数据类型,*a
和 *b
将指向这些内存空间也被共享,以便其他进程可以访问它。
所以你的问题的解决方案将是这样的。
//Create the shared memory to hold the structure.
shmid=shmget(KEY1,sizeof(struct processData),IPC_CREAT|0666);
//Attach it to the process.
pData=shmat(shmid,0,0);
//Create a shared memory to hold an integer which will be pointed by *a.
shmid=shmget(KEY2,sizeof(int),IPC_CREAT|0666);
//Attach the shared memory to the location pointed by *a.
pData->a=shmat(shmid,0,0);
//Create a shared memory to hold an integer which will be pointed by *b.
shmid=shmget(KEY3,sizeof(int),IPC_CREAT|0666);
//Attach the shared memory to the location pointed by *b.
pData->b=shmat(shmid,0,0);
这是您应该创建共享内存并将其附加到将要访问共享内存的所有进程的方式。
(注意:您不需要使用 3 个单独的键值创建 3 个单独的共享内存。也可以通过使用 1 个键创建一个足够大的共享内存块,然后查找指向的指针来完成它们各自在共享内存中的位置。这有点复杂,所以我给出了一个简单的例子以便更好地理解。)
现在进入下一个问题。由于您在结构中使用指针,因此不能像这样为它们赋值,pData -> a = SOME_NUMBER;
。因为,pData -> a
是一个指针,要为它赋值,您需要对它进行引用。所以它会这样做。
*(pData -> a) = SOME_NUMBER;
类似地,读取其他进程中的值也需要在那里取消引用。
SOME_NUMBER = *(pData -> a);
关于在共享内存中创建和访问结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29138327/