使用C语言开发项目:如何用shmget或ftok检查共享内存是否存在?
判断共享内存是否存在的可行方法(基于shmget())
核心判断逻辑
通过shmget()的标志位组合和错误码可以精准判断共享内存的状态:
- 检查是否存在:调用
shmget(key, 0, IPC_CREAT | IPC_EXCL),若返回-1且errno == EEXIST,说明该key对应的共享内存已存在;若成功返回非负shmid,说明之前不存在且已临时创建(仅做检查的话,后续可调用shmctl(shmid, IPC_RMID, NULL)删除刚创建的内存)。 - 仅连接已存在内存:直接调用
shmget(key, 0, 0),若返回-1且errno == ENOENT,说明共享内存不存在;若返回有效shmid,则成功连接到已存在的共享内存。
关键注意点
- 区分
EEXIST(已存在)和EACCES(权限不足):如果shmget返回-1且errno == EACCES,说明共享内存存在但当前进程无操作权限,而非不存在。 - 确保使用的
key唯一固定(比如通过ftok()生成),避免与其他共享内存实例冲突。
示例代码
#include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <errno.h> #include <stdlib.h> // 检查指定key的共享内存是否存在 int shm_exists(key_t key) { int shmid = shmget(key, 0, IPC_CREAT | IPC_EXCL); if (shmid == -1) { if (errno == EEXIST) { return 1; // 已存在 } else { perror("shmget error"); return -1; // 其他错误 } } else { shmctl(shmid, IPC_RMID, NULL); // 删除临时创建的内存 return 0; // 不存在 } } int main() { key_t key = ftok("/tmp", 'A'); // 生成固定key if (key == -1) { perror("ftok error"); exit(1); } int exists = shm_exists(key); if (exists == 1) { printf("共享内存已存在\n"); // 尝试连接已存在的内存 int shmid = shmget(key, 0, 0); if (shmid != -1) { printf("成功连接,shmid: %d\n", shmid); } else { perror("连接失败"); } } else if (exists == 0) { printf("共享内存不存在\n"); } else { printf("状态检查失败\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Kefest1
相关产品推荐
相关产品推荐

