#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 );