You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下非父子进程如何便捷获取共享内存大小?

解决Linux共享内存大小获取问题(非父子进程)

针对你用shm_open+ftruncate+mmap创建的共享内存,非父子进程间获取大小的简单方法有以下几种:

方法1:通过fstat获取共享内存对象的文件大小

shm_open创建的共享内存本质是/dev/shm目录下的临时文件,消费者可以直接打开该共享内存对象,调用fstat获取其st_size字段,这就是共享内存的实际大小。

示例代码:

#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>

off_t get_shm_size(const char* shm_name) {
    int fd = shm_open(shm_name, O_RDONLY, 0);
    if (fd == -1) {
        // 处理错误逻辑
        return -1;
    }
    struct stat sb;
    if (fstat(fd, &sb) == -1) {
        close(fd);
        return -1;
    }
    close(fd);
    return sb.st_size;
}

方法2:在共享内存头部预留区域存储大小

生产者在创建并截断共享内存后,先将内存大小写入共享内存的起始位置(比如用固定长度的整数类型),消费者映射共享内存后,先读取这个头部的值,就能直接得到总大小。

示例代码(生产者侧):

#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdint.h>

#define SHM_NAME "/my_shared_mem"
#define SHM_SIZE (1024 * 1024) // 1MB

int main() {
    int fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666);
    ftruncate(fd, SHM_SIZE + sizeof(uint64_t)); // 预留头部空间
    void* addr = mmap(NULL, SHM_SIZE + sizeof(uint64_t), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    *(uint64_t*)addr = SHM_SIZE; // 写入大小到头部
    // 后续使用 addr + sizeof(uint64_t) 作为实际数据区域
    // ...
    return 0;
}

消费者侧读取大小:

#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdint.h>

#define SHM_NAME "/my_shared_mem"

int main() {
    int fd = shm_open(SHM_NAME, O_RDONLY, 0666);
    // 先映射头部区域获取大小
    void* addr = mmap(NULL, sizeof(uint64_t), PROT_READ, MAP_SHARED, fd, 0);
    uint64_t shm_size = *(uint64_t*)addr;
    // 重新映射整个内存区域
    munmap(addr, sizeof(uint64_t));
    addr = mmap(NULL, shm_size + sizeof(uint64_t), PROT_READ, MAP_SHARED, fd, 0);
    void* data_ptr = addr + sizeof(uint64_t);
    // 使用数据区域
    // ...
    return 0;
}

方法3:脚本/命令行场景下直接用stat命令

如果是在shell脚本中需要获取大小,直接执行:

stat -c %s /dev/shm/your_shm_name

该命令会输出共享内存的字节数。


内容的提问来源于stack exchange,提问作者Leon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 06:20:01