#linux #sysv-ipc
#linux #sysv-ipc
Вопрос:
Я запускаю простую тестовую программу, которая использует разделяемую память SYSV. Я обнаружил, что иногда shmget () возвращает нулевой shmid, если запрошенный сегмент общей памяти уже существует. кто-нибудь может объяснить, в каком сценарии shmaget () возвращает нулевой shmid?
Заранее спасибо.
Комментарии:
1. Я рекомендую вам выполнить поиск
man shmaget
с помощью поисковой системы по вашему выбору. Или вы делаете это в своей системе, при условии, что установлены соответствующие справочные страницы.2. Я уже просмотрел справочную страницу shmget. В нем говорится, что «При успешном выполнении возвращается действительный идентификатор разделяемой памяти. При ошибке возвращается значение -1» . Меня беспокоит то, что нулевой является допустимым shmid? и в каком сценарии shmget() возвращает ноль.
3. Если это то, что написано на странице руководства, я думаю, вам следует положиться на это.
-1
это код ошибки, в противном случае это действительный идентификатор общей памяти (включая0
). Это довольно распространенное явление для функций такого типа. В чем проблема? Это просто идентификатор, а не адрес или что-то в этом роде. И, скорее всего, идентификаторы просто увеличиваются.4. Это означает, что я неверно проверяю возвращаемое значение shmget(). Я проверяю, если (0 < shmget (ключ, размер, флаги), тогда успех. ноль следует рассматривать как действительный идентификатор. У меня возникли эти сомнения, потому что shmget () очень редко возвращает ноль. Большое вам спасибо за ваше драгоценное время.