Биты прав доступа к общей памяти System V: значение и как его изменить
Я знаю, что когда я создаю блок общей памяти, мы устанавливаем разрешение, чтобы каждый процесс мог читать и писать в этом блоке с 0777 (не знаю почему, мой учитель только что сказал использовать его таким образом).
Я создаю с shmget как:
shmget(IPC_PRIVATE, sizeof(server_config), IPC_CREAT|0777)
Однако я хотел бы знать:
Что означает каждый номер
Как изменить флаг после создания блока общей памяти
Как разрешить запись только 1 процесса, в то время как все остальные процессы могут только читать
1 ответ
Это восьмеричное число OR
Параметры ed те же, что вы используете для прав доступа к каталогу.
Это их значение ( источник)
rwx rwx rwx = 111 111 111
rw- rw- rw- = 110 110 110
rwx --- --- = 111 000 000
and so on...
rwx = 111 in binary = 7
rw- = 110 in binary = 6
r-x = 101 in binary = 5
r-- = 100 in binary = 4
Где, конечно, r
стоит для чтения и w
для записи тогда x
значит выполнить.
Есть также константы, определенные с этими значениями (см. Человек open(2)
)
S_IRWXU 00700 user (file owner) has read, write and execute permission
S_IRUSR 00400 user has read permission
S_IWUSR 00200 user has write permission
S_IXUSR 00100 user has execute permission
S_IRWXG 00070 group has read, write and execute permission
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 others have read, write and execute permission
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
Как вы видете 0777
имеет ведущий 0
потому что это восьмеричное и эквивалентно S_IRWXU | S_IRWXG | S_IRWXO
,
Чтобы ответить на два других вопроса:
Вы можете изменить разрешения для блока общей памяти с помощью
shmctl
, Это выглядит примерно так - полностью не проверено, может быть глючит:int change_shm_perm(int shmid, mode_t new_permissions) { struct shmid_ds buf; if (shmctl(shmid, IPC_STAT, &buf)) { perror("shmctl(IPC_STAT)"); return -1; } buf.shm_perm = (buf.shm_perm & ~0777) | (new_permissions & 0777); if (shmctl(shmid, IPC_SET, &buf)) { perror("shmctl(IPC_SET)"); return -1; } return 0; }
Чтобы разрешить запись только одному процессу, в то время как все остальные могут только читать, процесс с правами записи должен запускаться под своим собственным uid. Затем этот процесс создает сегмент памяти и устанавливает для него права доступа
0644
, Из объяснения битов режима должно быть ясно, почему это дает желаемый эффект.