我正在尝试在 C 中使用 POSIX 共享内存 IPC API,它基本上遵循模式
shm_open() -> ftruncate() -> mmap() -> use -> munmap() -> shm_unlink()
(后两者是可选的 IIUC)。我注意到前两个调用需要不同的标志来指定权限和选项,但我无法弄清楚其中的区别。从手册页:
int shm_open(const char *name, int oflag, mode_t mode);
--------- -----------
FIRST SECOND
oflag is a bit mask created by ORing together exactly one of O_RDONLY or O_RDWR
O_RDONLY
Open the object for read access. A shared memory object opened in this way can be mmap(2)ed only for read (PROT_READ) access.
O_RDWR Open the object for read-write access.
O_CREAT
Create the shared memory object if it does not exist. The user and group ownership of the object are taken from the corresponding effec‐
tive IDs of the calling process, and the object's permission bits are set according to the low-order 9 bits of mode, except that those
bits set in the process file mode creation mask (see umask(2)) are cleared for the new object. A set of macro constants which can be used
to define mode is listed in open(2). (Symbolic definitions of these constants can be obtained by including <sys/stat.h>.)
然后
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
--------
THIRD
The prot argument describes the desired memory protection of the mapping (and must not conflict with the open mode of the file). It is either
PROT_NONE or the bitwise OR of one or more of the following flags:
PROT_EXEC Pages may be executed.
PROT_READ Pages may be read.
PROT_WRITE Pages may be written.
PROT_NONE Pages may not be accessed.
我的问题是:突出显示的三个地方给出的权限有什么区别?
我注意到的一些事情:
O_RDONLY
中指定 shm_open()
,但是要使用 ftruncate()
在虚拟文件中分配一些空间,您无论如何都需要拥有写入权限 (O_RDWR
),那有什么意义呢?SECOND
)After the mmap() call has returned, the file descriptor, fd, can be closed immediately without invalidating the mapping.
,所以我想如果你想创建一个只读文件(因为其他进程可能会写入它)你必须首先打开它具有写权限,然后将其映射为只读模式,然后释放 fd?一个文件系统条目具有访问权限,至少有所有者、组所有者和其他人的三个“权限”(读、写、执行)。 当进程请求访问该对象时使用它们;所请求的访问将针对这些授权进行测试。
当您“打开”您请求意图的内容时,这是在
oflag
参数中指定的(我想读 RD_ONLY
,或者我想写,或者...)。有时您请求打开不存在的东西,同时在必要时创建它(O_CREAT
)。在这种情况下,您需要通过 mode
参数指定访问权限。
一旦打开该对象,您就可以按照在开头声明的方式使用它。对于共享内存对象,您需要将其映射到进程地址空间才能访问它。这就是
mmap
的目的,将该对象映射到进程内存中的某个位置。地址空间的任何内存块也受到保护;例如,您的进程的代码(默认情况下)受到写入保护,等等。因此,如果您映射共享内存对象,您需要指定该内存的保护内容,这就是 prot
参数的目的。