如何忽略umask来创建具有给定权限的文件

问题描述 投票:0回答:3

我正在使用 open 函数并使用 O_CREAT | 创建一个文件O_EXCEL。我已将模式传递为“0666”。但通过屏蔽最终分配给它的权限是 -rw-r--r-- 而不是 -rw-rw-rw- 。有人告诉我我可以使用 umask (011),然后再次重置原始掩码。 但我不知道如何在 C++ 程序中传递它。这是我正在做的事情的一小段。

   # include <iostream>
   # include <stdio.h>
   # include <conio.h>
   #include <sys/types.h>
   #include <sys/stat.h>
   #include <fcntl.h>

   using namespace std;

   int main()
   {
    int fd = open("C:\\Users\\Ritesh\\Music\\music.txt", O_CREAT | O_EXCL, 0666);   
    getch();
    return 0;   
  } 

创建文件

C:\Users\Ritesh\Music\music.txt
经许可
-rw-r--r-- .
我希望它是
-rw-rw-rw-

c++ unix solaris
3个回答
4
投票
mode_t old_mask;

old_mask = umask(011);
open( ... );
umask(old_mask);

2
投票

umask 表示默认情况下您不想授予文件的权限。因此,如果你想在创建文件时完全控制权限,请将umask设置为0,这告诉操作系统不要保留任何权限,让你做主。像这样:

int main()
{
    mode_t oldmask = umask(0);
    int fd = open("C:\\Users\\Ritesh\\Music\\music.txt", O_CREAT | O_EXCL, 0666);
    close(fd);
    umask(oldmask);
    getch();
    return 0;   
} 

2
投票

将文件权限设置为所需的only线程安全方法是在创建文件后使用

chmod()
fchmod()
显式设置它们(没有错误检查的示例):

int fd = open("C:\\Users\\Ritesh\\Music\\music.txt", O_CREAT | O_EXCL, 0666);
fchmod(fd, 0666 );

如果使用

umask()
,您将更改整个过程的
umask
值。如果任何其他线程正在运行,您将面临使用意外权限创建文件的风险,这可能会导致安全问题或其他问题。当您更改的
umask
值生效时创建的任何子进程都将使用意外的
umask
值创建。

© www.soinside.com 2019 - 2024. All rights reserved.