Биты прав доступа к общей памяти 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, Из объяснения битов режима должно быть ясно, почему это дает желаемый эффект.

Другие вопросы по тегам