如何解决无法在共享库中附加共享内存
我想使用共享库中的共享内存进行数据交换和操作套接字。
在我的库中,当第一个进程加载共享库时,将在构造函数中创建共享内存。
然后,第二个进程加载共享库,我要附加此共享内存。
尽管密钥相同,但第二个进程会创建其他共享内存。
这是示例代码。
char* sharedmemory;
__attribute__ ((constructor)) void attach_sharedmemory() {
key_t key = 10;
errno = 0
int seg_id = shmget(key,1000,IPC_CREAT | IPC_EXCL | 0660);
if(seg_id == -1){
if(errno == EEXIST){
seg_id = shmget(key,0);
if(seg_id == -1){
exit(1);
}else{
shared_memory = (char*)(shmat(seg_id,0));
}
}else{
exit(1);
}
}else{
shared_memory = (char*)(shmat(seg_id,0));
}
}
void dllfunction1(){}
void dllfunction2(){}
ipcs
命令结果在这里。
第二个进程shmid始终是第一个进程的shmid + 1。
#result of ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000XXX 65536 user1 660 1000 1 dest <--- created first process
0x00000YYY 65537 user1 660 1000 1 dest <--- created second process
我该如何解决?
我的环境是Ubuntu 20.04LTS。 编译的GCC。
解决方法
由于标志位IPC_EXCL,调用shmget()
的第二个进程失败
符合预期;尽管下一次对shmget()
的调用重用了相同的键,并且
标志更改为0(无IPC_EXCL),大小为0导致出现新的段。
通过重复使用相同的键和大小(再次使用无IPC_EXCL的标志),第二个 流程可以获取相同的细分ID并附加。下面的示例代码是 基于原始文件并添加了shmem detach:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/shm.h>
static void *sharedmemory;
static int seg_id;
__attribute__ ((constructor))
void attach_shmem(void)
{
key_t key = 10;
size_t size = 1000;
seg_id = shmget(key,size,IPC_CREAT | IPC_EXCL | 0660);
if ((seg_id == -1) && (errno == EEXIST))
seg_id = shmget(key,0);
if (seg_id == -1)
exit(1);
sharedmemory = shmat(seg_id,NULL,0);
}
__attribute__ ((destructor))
void detach_shmem(void)
{
(void) shmdt(sharedmemory);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。