C 程序 mkdir in POSIX shared memory missing permissions

C program to mkdir in POSIX shared memory missing permissions

我有一个 POSIX 共享内存目录,它在重新启动时会消失,有时需要重新创建。举个例子,

#include <sys/stat.h>
#include <sys/file.h>

int main(int argc, char argv[])
{
    struct stat st = {0};
    if (stat("/dev/shm/example", &st) == -1) {
        mkdir("/dev/shm/example", 0777);
    }
}

这将创建缺少 group/others 写入权限的目录:

drwxr-xr-x. 2 *** *** *** May 14 12:00 example

我尝试使用 mode_t 标志进行试验,甚至将“0777”替换为“S_IRWXU | S_IRWXG | S_IRWXO”。我确实需要该目录具有权限标志 0777。

您需要明确设置权限或重置您的file creation mask with the umask() function

根据 POSIX mkdir() documentation(加粗我的):

The mkdir() function shall create a new directory with name path. The file permission bits of the new directory shall be initialized from mode. These file permission bits of the mode argument shall be modified by the process' file creation mask.

创建具有您想要的确切权限的文件或目录的唯一线程安全方法是在创建后显式设置它们:

mkdir("/dev/shm/example", 0777);
chmod("/dev/shm/example", 0777);

当然,您最好实际检查这些调用的 return 值。

调用 umask() 来设置和恢复文件创建掩码 不是线程安全的:

mode_t old = umask( 0 );
mkdir("/dev/shm/example", 0777);
umask( old );

这样做可能会出现多种竞争条件:

  • 第一次调用 umask() 时获得的 old 掩码可以是另一个线程
  • 设置的 0
  • 任何一个调用都可以覆盖另一个线程当前正在使用的文件创建掩码的值

如果这些竞争条件中的任何一个发生,要么

  • 您的 file/directory 不会获得您需要的权限
  • 另一个线程的 file/directory 不会获得它需要的权限
  • 原来的文件创建掩码设置将丢失

或全部三个。

因此,当您需要准确设置权限位时,请不要调用 umask()。通过调用 [f]chmod()

显式设置模式

(在 /dev/shm 中创建目录可能引起的问题可能值得另一个问题...)