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

标签 c process multiprocessing shared-memory

如果我有一些结构

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/

相关文章:

multithreading - 缓存可以保存来自多个进程的数据吗?

c - C语言中的栈,如何实现

C fork 和进程,为什么有必要这样做?

c++ - 如何获取 ShellExecuteEx.. hProcess 打开的窗口的 hWnd?

python - Spyder 中的简单 Python 多处理函数不输出结果

c - 多进程读/写fifo

c - 如何用已有的元素填充链表?

c++ - C/C++。库相对于组合目标文件的优势

c - 具有静态 const 成员的动态分配数组

node.js - 在 NodeJS 中处理长时间运行的进程?