shm_open
时间: 2025-04-07 16:05:04 浏览: 20
### shm_open 的用法及其 POSIX 共享内存示例
`shm_open` 是 POSIX 标准定义的一个函数,用于创建或打开一个命名共享内存对象。它类似于文件操作中的 `open` 函数,但它专门针对共享内存设计。以下是关于其基本用法以及一些常见错误处理的信息。
#### 基本语法
`shm_open` 的原型如下所示:
```c
#include <sys/mman.h>
int shm_open(const char *name, int oflag, mode_t mode);
```
- **参数说明**
- `name`: 表示共享内存对象的名字,通常以 `/` 开头表示全局可见的对象[^1]。
- `oflag`: 定义如何访问该共享内存对象(如只读、写入等),可以使用标志位组合来设置权限[^2]。
- `O_RDONLY`, `O_RDWR`: 设置为只读或者可读写的模式。
- `O_CREAT`: 如果指定名称的共享内存不存在,则会创建一个新的共享内存对象。
- `O_EXCL`: 当与 `O_CREAT` 结合使用时,如果已经存在同名的共享内存对象则返回错误。
- `mode`: 只有当设置了 `O_CREAT` 并成功创建新对象时才会生效,用来设定权限掩码(例如 S_IRUSR 和 S_IWUSR 组合代表用户具有读写权限)[^3]。
#### 返回值解释
- 成功调用后返回一个非负整数作为文件描述符。
- 失败情况下返回 `-1` 同时设置相应的 errno 错误代码[^4]。
#### 使用示例
下面是一个简单的 C 程序展示如何利用 `shm_open` 创建并映射一段共享内存区域:
```c
#include <fcntl.h> /* For O_* constants */
#include <sys/stat.h> /* For mode constants */
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define SHM_NAME "/my_shared_memory"
#define BUFFER_SIZE 1024
int main() {
int fd;
void* ptr;
// 打开/创建共享内存区
fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
if (fd == -1){
perror("Failed to open shared memory");
exit(EXIT_FAILURE);
}
// 调整大小到所需缓冲尺寸
if(ftruncate(fd, BUFFER_SIZE) == -1){
close(fd);
perror("ftruncate failed");
exit(EXIT_FAILURE);
}
// 映射共享内存至进程地址空间
ptr = mmap(NULL, BUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if(ptr == MAP_FAILED){
close(fd);
perror("mmap failed");
exit(EXIT_FAILURE);
}
strcpy((char*)ptr,"Hello Shared Memory!");
printf("%s\n", (char *)ptr);
munmap(ptr,BUFFER_SIZE);
close(fd);
return EXIT_SUCCESS;
}
```
上述程序展示了完整的流程:从通过 `shm_open` 创建共享内存对象开始,经过调整大小 (`ftruncate`) 到最终将其映射进入当前进程中以便于存取数据 (^5]).
#### 关键点总结
- 需要显式关闭不再使用的共享内存句柄(`close`)。
- 访问结束后应该解除映射关系(`munmap`)。
- 删除不需要再保留下来的共享资源可通过 `shm_unlink` 实现[^6].
阅读全文
相关推荐


















