当前位置: 首页 > 面试题库 >

POSIX共享内存和信号灯权限因打开调用而设置不正确

束雅达
2023-03-14
问题内容

我试图创建一个共享内存,该共享内存将由多个进程使用,而不必由同一用户启动,因此我用以下行创建了该段:

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 不像-rw----rw-我预期的那样。

/ dev / shm的权限为lrwxrwxrwx。

相同的信号量也会发生完全相同的事情。

内核版本:3.0.0-23-通用

glibc版本:EGLIBC 2.13-20ubuntu5.1

任何人有任何想法吗?


问题答案:

可能是umask

援引的手册页shm_open

   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>.)

因此,为了允许创建可全局写入的文件,您需要设置允许它的umask,例如:

umask(0);

进行这样的设置,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);
}


 类似资料:
  • 它编译得很好,但是当我试图运行它时,当它到达部分时,我得到了一个分段错误。我在其他地方读到过,不应该创建指向信号量的指针,但是当我没有创建并尝试时,我遇到了一个关于需要lvalue的错误。任何帮助都将不胜感激。

  • 我想创建一个共享内存和信号量的C程序。应该有两个子进程。两个孩子都有一个不同的int数。然后有一个目标号码,应该写在共享内存中。现在两个孩子都应该从进球数中减去他们的数字,直到进球数低于或等于0。我不希望出现比赛条件。这就是为什么我尝试使用信号量。但对我没用。下面是我的代码:

  • 我尝试编写一个共享内存和信号量程序,该程序一直运行到按下Ctrl+C,即接收到: 当按下Ctrl+C时,被设置为,它会跳出循环并退出。在没有共享内存和信号量的情况下,这可以很好地工作,但是在这里,我从来没有在上获得字符串,只捕获并且它继续运行。 为什么?

  • 我在编写一些简单的代码来自学信号量和POSIX共享内存时遇到了问题。 其思想是一个程序,即服务器,打开共享内存并向其中写入一个结构(包含信号量和数组)。然后它等待输入,输入之后信号量递增。 同时,客户端打开共享内存,等待信号量,在服务器增加信号量之后,读取结构。 服务器似乎工作正常,但是我在客户端的函数处立即遇到了一个segfault(甚至在服务器增加它之前)。我想不出哪里出了问题。 服务器代码:

  • 我需要编写一个程序,它正在创建N个数量的子进程,每一个进程都将一个添加到共享内存变量中。我的想法是使用信号量和共享内存,但进程之间并没有相互等待,共享内存变量也没有像我希望的那样工作。 MyDefs.H Main.C 奴隶Proc.c