как вернуть существующий идентификатор очереди сообщений

Я использую системный вызов msgget() для получения новой очереди сообщений. Я использовал здесь флаги IPC_CREAT и IPC_EXCL. например message_queue = msgget(ftok("/tmp", 100), (0666 | IPC_CREAT | IPC_EXCL)); Теперь, когда моя прога неожиданно появляется, очередь сообщений остается, и мне не удается воссоздать очередь сообщений. Итак, мой вопрос: «Как я могу вернуть идентификатор существующей очереди сообщений?»

и, кстати, где очередь msg хранит свой идентификатор?


person JohnG    schedule 05.04.2012    source источник


Ответы (3)


Regd "Как я могу вернуть идентификатор существующей очереди сообщений?"

От человека msgget

   If  msgflg  specifies both IPC_CREAT and IPC_EXCL and a message queue already exists for key, then msgget() fails with errno set to EEX-
   IST.  (This is analogous to the effect of the combination O_CREAT | O_EXCL for open(2).)

Попробуйте без флага IPC_EXCL.

Заказной. где очередь msg хранит свой идентификатор

из man proc

   /proc/sysvipc
          Subdirectory  containing  the  pseudo-files  msg,  sem  and  shm.  These files list the System V Interprocess Communication (IPC)
          objects (respectively: message queues, semaphores, and shared memory) that currently  exist  on  the  system,  providing  similar
          information  to that available via ipcs(1).  These files have headers and are formatted (one IPC object per line) for easy under-
          standing.  svipc(7) provides further background on the information shown by these files.
person tuxuday    schedule 05.04.2012
comment
спасибо за ответ user967552. Это было очень полезно. - person JohnG; 05.04.2012

Ниже приведена попытка ответить на этот вопрос. Если он полезен, ссылка должна быть предоставлена ​​The Linux Programmer's Руководство. Если это идентифицируется как не относящееся к делу или что-то в этом роде, все ошибки мои.

Команду ipcs можно использовать для получения состояния всех объектов System V IPC.

ipcs -q: Show only message queues
ipcs -s: Show only semaphores
ipcs -m: Show only shared memory
ipcs --help: Additional arguments

Команду ipcrm можно использовать для удаления объекта IPC из ядра. В то время как объекты IPC можно удалять с помощью системных вызовов в пользовательском коде (сейчас мы увидим, как это сделать), часто возникает необходимость, особенно в средах разработки, удалять объекты IPC вручную.

Его использование простое:

ipcrm <msg | sem | shm> <IPC ID>
person Feng    schedule 18.09.2012

Не пытайтесь повторно создавать очередь сообщений во второй раз. Ваше использование IPC_CREAT | IPC_EXCL во второй раз приводит к сбою msgget.

Со страницы руководства msgget

Если msgflg указывает как IPC_CREAT, так и IPC_EXCL и для ключа уже существует очередь сообщений, то msgget() завершается ошибкой с Для ошибки задано значение EEXIST. (Это аналогично эффекту комбинации O_CREAT | O_EXCL для open(2).)

Таким образом, вы можете продолжать использовать msgget во второй раз, но использовать только флаг IPC_CREAT. Также обязательно проверьте возвращаемые значения как ftok, так и msgget и сравните значения ошибок, если таковые имеются, со страницей руководства. Также проверьте errno.

Кроме того, если у вас слишком много проблем с существующей очередью сообщений, вы можете удалить ее, вызвав msgctl вместе с флагом IPC_RMID.

Кроме того, другой ответ о том, где хранятся очереди сообщений. У вас может возникнуть соблазн удалить вызывающую беспокойство очередь сообщений :) Но учтите, это файлы только для чтения, расположенные в виртуальной файловой системе /proc!

person Pavan Manjunath    schedule 05.04.2012
comment
@JohnG Рад, что это помогло тебе, Джон! :) - person Pavan Manjunath; 05.04.2012