C共享内存双向量

时间:2014-03-08 15:43:36

标签: c ipc shared-memory

如何在进程之间共享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);
}

EDIT1: 我只设法使用shmget。 shmat总是给我带来错误。 这个链接对我没有帮助。

1 个答案:

答案 0 :(得分:2)

看来你的方式正确。 以下是一些可能有助于避免常见陷阱的提示。

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所有者:

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);