我有这样的结构
typedef struct {
int id; //Client ID
int size; //Memory Size
int mem; //ID obtained from shmid
int buf; //shared memory var
} Segm;
Segm segms[10];
int count_s = 0;
int * buffer; /* shared buffer */
/* we declared to zone to share */
buffer = shmat (mem, (char *)0, 0);
if (buffer == NULL) {
fprintf (stderr, "Error reserve shared memory \n");
return -1;
}
segms[count_s].mem = mem;
segms[count_s].buf = *buffer;
上面的代码为当前结构创建共享内存,并且工作正常,但是当我尝试分离内存时,shmdt 抛出错误,参数无效,我不明白为什么。
int mem = segms[i].mem;
/* detach from the segment: */
if (shmdt(&segms[i].buf) == -1) {
perror("[SHMservice] Error: shmdt");
result = -2;
}
shmctl (mem, IPC_RMID, (struct shmid_ds *)NULL);
最佳答案
您向 shmdt
传递了错误的值:你给它的地址是 buf
你的结构体的成员,而不是你存储在 int
中的指针变量。
要解决这个问题,首先要修复你的结构。 buf
的类型应该是void*
(或者 int*
如果这对您来说更实用)。然后修复附加代码来设置它:
segms[count_s].buf = buffer;
如果你选择void*
,您应该调整 buffer
的类型也是。
然后你就可以shmdt(segms[i].buff)
.
关于c - C 中的共享内存,shmdt 问题,它抛出无效参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24473297/