【问题标题】:How to neglect the umask so as to create the file with given permission如何忽略 umask 以创建具有给定权限的文件
【发布时间】:2012-03-11 22:43:50
【问题描述】:

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

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

【问题讨论】:

  • 我很困惑。您如何拥有具有 Unix 权限位和 DOS 路径名的文件系统?什么O/S同时提供&lt;sys/stat.h&gt;&lt;conio.h&gt;
  • @Rob 别担心我只是在寻找要打开的头文件时复制了它。我只是在我的 Windows 系统上使用 DEV c++。实际上我在工作场所使用 solaris。很抱歉,如果它让您感到困惑。
  • 那么,您要问的是哪个系统? Windows 还是 Solaris?

标签: c++ unix solaris


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:
    mode_t old_mask;
    
    old_mask = umask(011);
    open( ... );
    umask(old_mask);
    

    【讨论】:

    • 使用mode_t old_mask; 是否给了我当前的掩码设置?而umask( old_mask ); 会将其设置回原始值?
    • @Invictus 是的,这是正确的。 (迟到总比没有好!)
    • 注意 umask 是一个进程范围的值。更改其值将影响所有其他正在运行的线程。
    【解决方案3】:

    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;   
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 2017-08-09
      • 2012-09-17
      • 2014-07-18
      • 2020-10-23
      相关资源
      最近更新 更多