【问题标题】:System V shared memory permission bits: meaning, and how to changeSystem V 共享内存权限位:含义,以及如何更改
【发布时间】:2016-01-18 12:33:14
【问题描述】:

我知道,当我创建一个共享内存块时,我们设置了权限,以便每个进程都可以使用 0777 在该块中读写(不知道为什么,我的老师只是说要这样使用它)。

我正在使用 shmget 创建:

shmget(IPC_PRIVATE, sizeof(server_config), IPC_CREAT|0777)

不过我想知道:

  • 每个数字的含义

  • 共享内存块创建后如何更改标志

  • 如何只允许1个进程写入,而其他所有进程只能读取

【问题讨论】:

  • 请明确说明您是如何创建共享内存块的;答案取决于您是使用旧的 System V API 来共享内存、新的 POSIX API 还是其他东西。 (“0777”非常强烈地暗示这是 Unixy,不是 Windows,但如果我对此有误,请直说。)
  • @zowl 很清楚,就像我在学习现代物理学时,我的老师说薛定谔方程的 H 原子解的分离常数要保持原样,我一点也不开心,而且解方程来理解为什么?
  • 是的,这正是我们需要知道的,谢谢。 (shmget 是“旧 System V API”的一部分。)
  • @iharob 我知道 Unix 模式位是什么意思,但问题的其他两部分需要澄清才能回答。

标签: c unix shared-memory sysv-ipc


【解决方案1】:

这是ORed 选项的八进制数,与您用于目录权限的选项相同。

这是他们的意思(source

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 代表 readw 代表 write 然后 x 代表 execute

还有用这些值定义的常量(见 man 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。从模式位的解释中应该可以清楚为什么这会产生预期的效果。

【讨论】:

  • 太糟糕了,不可能接受两个答案。但如果你不介意,我有一个解决方案。你怎么看?
  • @zwol 我假设第二部分意味着创建它的那个是可以写的那个?另外,你能测试一下吗?我会说 buf.perm 将是 buf.shm_perm,但我不确定,因为我从未听说过 shmctl
  • @iharob 我们可以反过来做吗?你比我更需要想象中的互联网点 ;-)
  • @AndréAlmeida 是的,创建它的那个是可以写的,只要所有其他程序都在不同的用户 ID 下运行。没有办法阻止使用 same uid 运行的其他程序能够写入。你说的很对,buf.perm 应该是buf.shm_perm,我太草率了。抱歉,我没有时间为此制定完整的测试程序。
  • @zwol 我不需要它们,或者至少我想那样想。
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 2016-10-18
相关资源
最近更新 更多