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

C++ 如何忽略umask以创建具有给定权限的文件,c++,unix,solaris,C++,Unix,Solaris,我正在使用open函数和O|u CREAT | O|u EXCEL创建一个文件。我已通过模式为“0666”。但是通过屏蔽,最终分配给它的权限是-rw-r--r--而不是 -rw rw rw-。有人告诉我我可以使用umask(011),然后再次重置原始掩码。 但我不知道如何在C++程序中传递。这是我正在做的事情的一小部分 # include <iostream> # include <stdio.h> # include <conio.h>

我正在使用open函数和O|u CREAT | O|u 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;   
  } 
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
int fd=open(“C:\\Users\\Ritesh\\Music\\Music.txt”,O_CREAT | O_EXCL,0666);
getch();
返回0;
} 

创建文件
C:\Users\Ritesh\Music\Music.txt,并具有权限-rw-r--r--。
我希望它是
-rw-rw-rw-

umask表示默认情况下不希望授予文件的权限。因此,如果您想在创建文件时完全控制权限,请将umask设置为0,这会告诉操作系统不保留任何权限,并允许您调用快照。像这样:

mode_t old_mask;

old_mask = umask(011);
open( ... );
umask(old_mask);
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;   
} 
将文件权限设置为所需权限的唯一线程安全方法是在创建文件时或创建文件后显式设置权限(例如,不进行错误检查):


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

我很困惑。如何使文件系统具有Unix权限位和DOS路径名?以及O/S同时提供的
?@Rob别担心,我只是在寻找打开的头文件时复制了它。我只是在我的Windows系统上使用DeV C++,实际上我在工作场所使用Solaris。很抱歉,这让你感到困惑。那么,你问的是哪个系统?Windows或Solaris?使用
mode\t old\u mask给我当前的掩码设置?和
umask(旧的_掩码)会将其设置回原始值吗?@invitus是的,这是正确的。(迟做总比不做强!)注意umask是一个进程范围的值。更改其值将影响正在运行的所有其他线程。
int fd = open("C:\\Users\\Ritesh\\Music\\music.txt", O_CREAT | O_EXCL, 0666);
fchmod(fd, 0666 );