Использование числового эквивалента IPC_CREAT в shmget () C - PullRequest
1 голос
/ 13 марта 2019

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 13 марта 2019

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

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

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

shm_open(..., O_RDWR|IPC_CREAT);

2 голосов
/ 13 марта 2019

Вы можете проверить это, выполнив printf("%o\n", IPC_CREAT | 0600). Будет напечатано 1600, если IPC_CREAT - 01000, который находится в моей системе.

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

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

...