C语言 如何使用shmget或ftok检查共享内存是否存在?

yxyvkwin  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(260)

我正在通过shm函数使用共享内存在c中编写项目。我想尝试“连接”到共享内存,并使用shmget()函数检查它是否存在。
我尝试了几个标志与此功能,但未能达到预期的结果。我想知道是否有一种方法,看看是否有一个共享内存已经存在。

ibrsph3r

ibrsph3r1#

manual page相当明确地说明了这一点。

int shmget(key_t key, size_t size, int shmflg);

如果 shmflg 同时指定了IPC_CREATIPC_EXCL,并且键的共享内存段已存在,则shmget()将失败,并将 errno 设置为EEXIST
再次,旗帜:

IPC_创建

  • 创建一个新的段。如果不使用此标志,则**shmget()**将查找与 key 关联的段,并检查用户是否具有访问该段的权限。
    IPC_排除
  • 此标志与IPC_CREAT一起使用,以确保此调用创建段。如果段已存在,则调用失败。

或者,如果未指定标志IPC_CREAT,并且对于给定的key不存在存储器段,则shmget失败并将errno设置为ENOENT

枚举

  • 给定的 key 不存在段,并且未指定IPC_CREAT

所以你可能想试试

errno = 0;

if (-1 == shmget(key, size, IPC_CREAT | IPC_EXCL)) {
    if (EEXIST == errno) {
        /* shared memory already exists */
    }
}

errno = 0;

if (-1 == shmget(key, size, 0)) {
    if (ENOENT == errno) {
        /* shared memory does not exist */
    }
}

另一方面,ftok(3)失败的原因与stat(2)相同。

相关问题