Linux POSIX共享内存和信号量权限由打开的调用错误设置
我正在尝试创建一个共享内存,它将由多个进程使用,而这些进程不一定由同一个用户启动,因此我创建了一个具有以下行的段:Linux POSIX共享内存和信号量权限由打开的调用错误设置,linux,posix,ipc,file-permissions,shared-memory,Linux,Posix,Ipc,File Permissions,Shared Memory,我正在尝试创建一个共享内存,它将由多个进程使用,而这些进程不一定由同一个用户启动,因此我创建了一个具有以下行的段: fd=shm_open(SHARE_MEM_NAME,O_RDWR | O_CREAT,0606) 但是,当我签出在/dev/shm中创建的文件的权限时,它们是: -rw----r--1 lmccauslin lmccauslin 1784 2012-08-10 17:11/dev/shm/CubeConfigShare 不是我所期望的那样 /dev/shm的权限是lrwxrwx
fd=shm_open(SHARE_MEM_NAME,O_RDWR | O_CREAT,0606)代码>
但是,当我签出在/dev/shm中创建的文件的权限时,它们是:
-rw----r--1 lmccauslin lmccauslin 1784 2012-08-10 17:11/dev/shm/CubeConfigShare
不是我所期望的那样
/dev/shm的权限是lrwxrwx
同样的事情也发生在同样创建的信号灯上
内核版本:3.0.0-23-generic
glibc版本:EGLIBC 2.13-20ubuntu5.1
有人有什么想法吗?可能是
引用:
这样设置,umask
将不再影响对已创建文件的任何权限。但是,您应该注意,如果随后创建另一个文件而不显式指定权限,那么该文件也将是可写的
因此,您可能只想暂时清除umask,然后恢复它:
#include <sys/types.h>
#include <sys/stat.h>
...
void yourfunc()
{
// store old
mode_t old_umask = umask(0);
int fd = shm_open(SHARE_MEM_NAME,O_RDWR | O_CREAT,0606);
// restore old
umask(old_umask);
}
#包括
#包括
...
void yourfunc()
{
//储存旧的
mode_t old_umask=umask(0);
int fd=shm_open(共享成员名称,O_RDWR | O_CREAT,0606);
//复古
乌马斯克(老乌马斯克);
}
据我所知,POSIX信号量是在共享内存中创建的。因此,您需要确保用户
rw对要创建的信号量的/dev/shm权限。
然后,作为一个方便的选项,在/etc/fstab文件中放入以下行以装载tmpfs:
无/dev/shm tmpfs默认值为0
因此,当您的计算机重新启动时,权限将从一开始就设置好
三台机器中的两台将/dev/shm设置为drwxrwx,而不允许创建信号量的机器将其设置为drwxr\u xr\u x。
您还可以查看共享内存限制:
------共享内存限制--------
最大分段数=4096
最大seg大小(千字节)=18014398509465599
最大总共享内存(KB)=18446744073642442748
最小分段大小(字节)=1
umask(0);
#include <sys/types.h>
#include <sys/stat.h>
...
void yourfunc()
{
// store old
mode_t old_umask = umask(0);
int fd = shm_open(SHARE_MEM_NAME,O_RDWR | O_CREAT,0606);
// restore old
umask(old_umask);
}