Существующий флаг C разделяемой памятью?

#c #memory-management #shared-memory #sysv

#c #управление памятью #разделяемая память #sysv

Вопрос:

Я уже видел этот вопрос на SO, но мне не был понятен следующий случай:

Был создан shm. Итак, если я вызову в моем случае:

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

значение shmid становится равным -1, если shm уже существует. Но могу ли я где-нибудь получить его идентификатор? Или мне нужно снова вызвать shmget(…) без флага EXCL, чтобы получить идентификатор?

Заранее спасибо

Комментарии:

1. Я думаю, вам нужно вызвать его снова. Это звучит как проблема XY, какова общая цель?

2. Когда он возвращает ошибку с EXCL и CREAT, просто вызовите его снова без EXCL и CREAT, чтобы получить идентификатор.

Ответ №1:

Обычно 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 amp;amp; 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 );