7

複数のプロセスで使用される共有メモリを作成しようとしていますが、必ずしも同じユーザーによって開始されるとは限らないため、次の行でセグメントを作成します。

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-generic

glibcバージョン:EGLIBC 2.13-20ubuntu5.1

誰かアイデアがありますか?

4

2 に答える 2

10

おそらく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);
}
于 2012-08-10T21:51:39.377 に答える