2

我已经在 SO 上看到了这个问题,但我不清楚以下情况:

已创建 shm。所以如果我打电话给我:

int shmid = shmget(key, sizeof(struct messageQueue), IPC_CREAT | S_IRWXU | IPC_EXCL);

如果 shm 已经存在,则 shmid 变为 -1。但是我可以在某个地方得到它的 ID 吗?或者我是否需要再次调用不带 EXCL 标志的 shmget(...) 才能获取 ID?

提前致谢

4

1 回答 1

3

通常,IPC_CREAT | IPC_EXCL如果您想创建和初始化一个新的内存块,则使用它。例如:

int shmid = shmget(key, sizeof(struct messageQueue), IPC_CREAT | S_IRWXU | IPC_EXCL);
if( shmid != -1 )
{
    /* initialization code */
}
/* if it already exists, open it: */
if( shmid == -1 && errno == EEXIST ) 
    shmid = shmget(key, sizeof(struct messageQueue), S_IRWXU );

if( shmid == -1 ) {
    perror("shmget");
}

如果你不需要初始化它,你可以跳过IPC_EXCL

int shmid = shmget(key, sizeof(struct messageQueue), IPC_CREAT | S_IRWXU );

如果你不需要创建它,你可以跳过IPC_CREAT

int shmid = shmget(key, sizeof(struct messageQueue), S_IRWXU );
于 2021-01-19T13:09:52.170 回答