如何忽略umask以便在给定权限下创建文件

时间:2012-02-21 15:56:47

标签: c++ unix solaris

我正在使用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 with permission -rw-r--r-- .我希望它为-rw-rw-rw-

3 个答案:

答案 0 :(得分:3)

    mode_t old_mask;

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

答案 1 :(得分: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 :(得分:0)

唯一 将文件权限设置为所需的线程安全方法是在之后使用 chmod()fchmod() 显式设置它们创建文件(没有错误检查的示例):

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

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