C共享内存双向量

Posted

技术标签:

【中文标题】C共享内存双向量【英文标题】:C shared memory double vector 【发布时间】:2014-03-08 15:43:35 【问题描述】:

如何在进程之间共享double*?

我正在尝试阅读 http://www.cs.cf.ac.uk/Dave/C/node27.html,但附加和分离对我来说太难理解了。

谁能举个简单的例子,如何共享双向量并对他进行操作?

我设法做到了:

double* vector;
vector = (double*) malloc(sizeof(double)*n); // n = number of elemenets

int shmid;
key_t key;
int size;
int shmflg;

key = 2413;
size = n * sizeof(double);
shmflg = IPC_CREAT;

if(shmid = shmget(key, size, shmflg) == -1)

  printf("shmget error\n");
  exit(-1);

编辑1: 我只设法使用了shmget。 shmat 总是对我造成错误。 这个链接对我没有帮助。

【问题讨论】:

How to shmget and shmat a double array in C?的可能重复 如果你“成功了”,问题是什么? errno 失败后说什么?你也可以显示 shmat 代码吗? 【参考方案1】:

看来你走对了。 以下是一些有助于避免常见陷阱的提示。

1) 每次调用共享内存函数时检查返回状态和错误消息(如果存在)(包括 errno.h 到您的代码中)。如果是 shmat,它可能是:

  shm = shmat(shmid, 0, 0);
  if(shm == (void*)-1)
  
    printf("error=%s\n", strerror(errno));
    shmctl(shmid, IPC_RMID, NULL);
  

2) 使用 ipcs -m 实用程序检查您机器上的共享内存。 您写道:“我只设法使用 shmget。shmat 总是对我造成错误”。 查看实用程序的输出,尤其是在 OUTPUT 列,您可能会得到一些提示,创建内存的权限不足,例如以下快照中的 michaelg owner:

T         ID      KEY        MODE        OWNER    GROUP
m  922746941   0x330846   ----------- michaelg    other
m  788529252   0x100b11c  --rw------- sybase12    other

3) 创建具有适当权限的共享内存。 当您仅将 IPC_CREAT 标志传递给 shmget 函数时,您“没有权限”创建内存,没有人可以附加此段。尝试授予更多权限。以下标志应该为当前用户拥有的每个进程创建一个具有读写权限的段。

shmflg=IPC_CREAT|S_IRUSR|S_IWUSR;

4) 一旦分配,共享内存段必须在不需要时从系统中显式删除。它应该由 shmctl 函数完成。考虑到该函数不会立即删除该段,它只会将其标记为删除的候选者,当该段未附加到任何进程时内核将其删除。在所有进程终止后,再次使用 ipcs -m 检查内存。如果您仍然看到您的共享内存段,您可能需要再次检查您的代码并添加更多 shmctl 删除该段。可以通过 ipcrm 命令从机器中删除共享内存段(参数见手册,它们在不同系统上可能不同)。

shmctl(seg_id, IPC_RMID, NULL);

【讨论】:

以上是关于C共享内存双向量的主要内容,如果未能解决你的问题,请参考以下文章

text 共享内存+互斥量实现Linux的进程间通信

回复:共享内存和信号量

c 共享内存demo

linux进程间的通信(C): 共享内存

如何在python和C / C ++中使用共享内存

临界区(critical section 每个线程中访问 临界资源 的那段代码)和互斥锁(mutex)的区别(进程间互斥量共享内存虚拟地址)