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
相关产品推荐
相关产品推荐

