【linux编程】共享内存

共享内存

下面是一个简单明了的 C++ demo,演示使用 shm_open + mmap 创建共享内存并在 mmap 后立即调用 shm_unlink,从而实现“匿名共享内存”(仅当前进程使用,路径消失,但映射依然有效)。

#include <fcntl.h>      // shm_open
#include <sys/mman.h>   // mmap
#include <sys/stat.h>   // mode constants
#include <unistd.h>     // ftruncate, close
#include <string.h>     // memset, memcpy
#include <iostream>
#include <cstdlib>      // exit
#include <errno.h>

int main() {
    const char *shm_name = "/my_test_shm";
    const size_t size = 4096;

    // 1. 创建共享内存对象
    int fd = shm_open(shm_name, O_CREAT | O_EXCL | O_RDWR, 0666);
    if (fd < 0) {
        perror("shm_open");
        exit(1);
    }

    // 2. 设置共享内存大小
    if (ftruncate(fd, size) < 0) {
        perror("ftruncate");
        exit(1);
    }

    // 3. mmap 映射
    void *addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (addr == MAP_FAILED) {
        perror("mmap");
        exit(1);
    }

    std::cout << "mmap success, address = " << addr << std::endl;

    // 4. 取消路径引用 —— 共享内存对象不再可见
    if (shm_unlink(shm_name) < 0) {
        perror("shm_unlink");
        // 不退出,继续演示 mmap 是有效的
    } else {
        std::cout << "shm_unlink success: " << shm_name << std::endl;
    }

    // 5. 写入数据
    const char *message = "Hello from shared memory!";
    memcpy(addr, message, strlen(message) + 1);
    std::cout << "Wrote message: " << message << std::endl;

    // 6. 读取数据
    std::cout << "Read message: " << static_cast<char*>(addr) << std::endl;

    // 7. 清理
    munmap(addr, size);
    close(fd);

    return 0;
}

编译运行:

g++ -std=c++11 shm_demo.cpp -o shm_demo
./shm_demo
mmap success, address = 0x7f2f201da000
shm_unlink success: /my_test_shm
Wrote message: Hello from shared memory!
Read message: Hello from shared memory!

 

参考资料

1. yum提示报错

2. centos8stream 修改为阿里云yum源

3. CentOS Stream 9 和 RHEL 9 epel源的添加

posted @ 2022-03-21 10:38  苏格拉底的落泪  阅读(88)  评论(0)    收藏  举报