c - 无法在共享库中附加共享内存
问题描述
我想使用共享库中的共享内存来进行数据交换和操作套接字。
在我的库中,当第一个进程加载共享库时,在构造函数中创建共享内存。
然后,第二个进程加载共享库,我想附加这个共享内存。
但是第二个进程创建了其他共享内存,尽管密钥是相同的。
这是示例代码。
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, 0);
if(seg_id == -1){
exit(1);
}else{
shared_memory = (char*)(shmat(seg_id, 0, 0));
}
}else{
exit(1);
}
}else{
shared_memory = (char*)(shmat(seg_id, 0, 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。
解决方案
shmget()
由于标志位IPC_EXCL,第二个进程调用失败,如预期的那样;尽管下一次调用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, size, 0);
if (seg_id == -1)
exit(1);
sharedmemory = shmat(seg_id, NULL, 0);
}
__attribute__ ((destructor))
void detach_shmem(void)
{
(void) shmdt(sharedmemory);
}
推荐阅读
- autowired - Springboot测试中的UnsatisfiedDependencyException
- php - 从 json 中删除特定键值的双引号
- html - SSIS 将参数值传递给发送电子邮件的存储过程
- angular - 有人有在本地编译 Angular 源代码的想法吗?
- pyomo - 有没有人有一起使用 parmest 和 pyomo.dae 的例子?
- sql - 使用多个参数获取平均年龄
- google-app-engine - 如何配置我的存储库和 TravisCI 以自动部署到 GAE 标准环境?
- c# - 如何在正则表达式中使用命名组作为输入
- react-native - 在 React Native 中关闭 DEV 模式
- java - 即使我有 JAVA 8 也无法安装 Jenkins