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);
}