在共享内存中创建和访问结构

时间:2015-03-19 06:18:50

标签: c process multiprocessing shared-memory

如果我有一些结构

struct processData{
    int *a;
    int *b;
}

我将共享内存ID设置为

int shmid = shmget(1234, sizeof(processData), IPC_CREAT | 0666);

1234是我的关键

我会设置我的实际共享结构吗..

processData* pData =(processData *) shmat(shmid, NULL, 0);

然后我不应该在单独的过程中改变一些事情,例如:

pData -> a = SOME_NUMBER;

当我这样做时,我的所有进程都没有与同一块内存进行交互,而且我一无所知。

2 个答案:

答案 0 :(得分:2)

结构*a中的成员*bprocessData是整数指针类型。将共享内存附加到进程不会使它们指向共享内存中的内存位置。其次,您首先使用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);

答案 1 :(得分:0)

在本地进程中,使用以下命令将int的指针复制到结构中:

pData -> a = some-pointer;

实际上,您正在将逻辑内存地址(在当前进程中有效)复制到共享内存中。

当你从另一个进程读取这样的值时,它将是一个由其他东西占用的逻辑内存地址(可能也是当前可寻址的空间)。