无法在共享库中附加共享内存

时间:2020-10-15 10:07:29

标签: c linux shared-libraries shared-memory

我想使用共享库中的共享内存进行数据交换和操作套接字。
在我的库中,当第一个进程加载共享库时,将在构造函数中创建共享内存。
然后,第二个进程加载共享库,我要附加此共享内存。
尽管密钥相同,但第二个进程会创建其他共享内存。

这是示例代码。

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。

1 个答案:

答案 0 :(得分:0)

由于标志位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, size, 0);
    if (seg_id == -1)
        exit(1);
    sharedmemory = shmat(seg_id, NULL, 0);
}

__attribute__ ((destructor))
void detach_shmem(void)
{
    (void) shmdt(sharedmemory);
}