如何在进程之间共享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总是给我带来错误。 这个链接对我没有帮助。
答案 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);