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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:55:19