gpt4 book ai didi

C共享内存双 vector

转载 作者:太空宇宙 更新时间:2023-11-04 02:50:56 33 4
gpt4 key购买 nike

如何在进程间共享double*?

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

谁能举个简单的例子说明如何共享double vector并对他进行运算?

我设法做到了:

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 总是给我带来错误。这个链接对我没有帮助。

最佳答案

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

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共享内存双 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22271383/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com