#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», если бы я это увидел. И вы тоже, вероятно, не вспомнили бы, что это было через некоторое время.