我正在通过shm函数使用共享内存在c中编写项目。我想尝试“连接”到共享内存,并使用shmget()函数检查它是否存在。我尝试了几个标志与此功能,但未能达到预期的结果。我想知道是否有一种方法,看看是否有一个共享内存已经存在。
ibrsph3r1#
manual page相当明确地说明了这一点。
manual page
int shmget(key_t key, size_t size, int shmflg);
如果 shmflg 同时指定了IPC_CREAT和IPC_EXCL,并且键的共享内存段已存在,则shmget()将失败,并将 errno 设置为EEXIST。再次,旗帜:
IPC_创建
或者,如果未指定标志IPC_CREAT,并且对于给定的key不存在存储器段,则shmget失败并将errno设置为ENOENT。
IPC_CREAT
key
shmget
errno
ENOENT
枚举
所以你可能想试试
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)相同。
ftok(3)
stat(2)
1条答案
按热度按时间ibrsph3r1#
manual page
相当明确地说明了这一点。如果 shmflg 同时指定了IPC_CREAT和IPC_EXCL,并且键的共享内存段已存在,则shmget()将失败,并将 errno 设置为EEXIST。
再次,旗帜:
IPC_创建
IPC_排除
或者,如果未指定标志
IPC_CREAT
,并且对于给定的key
不存在存储器段,则shmget
失败并将errno
设置为ENOENT
。枚举
所以你可能想试试
或
另一方面,
ftok(3)
失败的原因与stat(2)
相同。