Использование числового эквивалента IPC_CREAT в shmget() C

#c #permissions #ipc #shared-memory

#c #разрешения #ipc #разделяемая память

Вопрос:

Я изучал, как создать общую память с помощью shmget() . До этого момента во всех примерах, которые я нашел, использовался IPC_CREAT | <shm_perm> формат для флага (или что-то подобное). Когда я проверил, мой bits/ipc.h контент IPC_CREAT был определен как 01000 .

Я попытался создать разделяемую память с разрешения 0600 . Сначала я использовал формальный метод = > IPC_CREAT | 0600 , он сработал. Затем вместо побитового ИЛИ двух только что использованных 01600 я не смог заметить никакой разницы в результате, но не уверен, применимо ли это ко всем случаям, поскольку я новичок в программировании на C.

Это может быть чем-то тривиальным, но мне интересно, почему лучше использовать метод OR-ing, а не просто конкатенацию 01 с требуемым типом разрешения (я обнаружил, что последний метод легче запомнить и ввести).

  • Есть ли особая функция, которой обладает формальный метод, и которой не хватает последнему (возможно, связано с ОС)?
  • Безопасно ли использовать последний метод, если мне удобнее с этим?

Ответ №1:

Первый метод является правильным способом вызова функции, поскольку он делает ваш код независимым от системы. Только потому, что IPC_CREAT определен как 01000 в вашей системе разработки, это не означает, что он будет таким же в других местах (хотя он, скорее всего, останется неизменным для основной версии той же операционной системы).

Его лучше использовать, чтобы освоиться с первым, на самом деле, это упрощает обслуживание вашего программного обеспечения.

Я бы даже рекомендовал зайти так далеко, чтобы заменить 0600 соответствующими константами, как в:

shm_open(..., O_RDWR|IPC_CREAT);

Ответ №2:

Вы можете проверить это, выполнив printf("%on", IPC_CREAT | 0600) . Он выведет 1600, если IPC_CREAT равен 01000, который есть в моей системе.

Но вот в чем проблема: макросы могут отличаться от системы к системе, поэтому вам не следует полагаться на значение в вашей системе.

А использование магических чисел делает код менее читаемым для других людей и для вас. Я могу понять, что IPC_CREAT | 0600 означает, когда я это вижу — окталы rwx хорошо известны — но я, вероятно, сказал бы «что, черт возьми, такое 01600», если бы я это увидел. И вы тоже, вероятно, не вспомнили бы, что это было через некоторое время.