尝试在C中创建具有所有权限的完整权限的文件

Mik*_*ike 3 c file-permissions file

在我的代码中,我有以下片段:

char* filename="/something.txt";
umask(0);
int filehandle=open(filename,O_WRONLY|O_CREAT|0x777);
close(filehandle);
Run Code Online (Sandbox Code Playgroud)

执行它时,即使我完全按照文档操作,也会创建文件,但权限设置不正确.

文件说明:

参数模式指定在创建新文件时使用的权限.它以通常的方式由进程的umask修改:创建的文件的权限是(mode&~umask).

对于模式,我指定了0x777,这意味着读,写和执行.对于umask,我指定为零,因此0x777 & ~0应该导致777.

实际结果的权限是670.

为什么这样,我该如何解决?

pax*_*blo 6

首先,它应该是八进制0777而不是十六进制0x777,等价是:

0x777   0111 0111 0111   011 101 110 111   r-xrw-rwx, plus other stuff(a)
0777    111 111 111          111 111 111   rwxrwxrwx
Run Code Online (Sandbox Code Playgroud)

其次,签名是:

int open(const char *pathname, int flags, mode_t mode);
Run Code Online (Sandbox Code Playgroud)

意思是模式是一个单独的参数,而不是你or带有标志的东西.

因此,您正在寻找的线路将是:

int filehandle = open (filename, O_WRONLY | O_CREAT, 0777);
Run Code Online (Sandbox Code Playgroud)

(a)我认为POSIX没有指定那些高位,但Linux会使用它们来表示文件是setgidsticky(虽然不是原始意义上的粘性意义代码保持缓存在交换空间中 - Linux从未支持过,而是使用粘性位来限制谁可以对粘性目录中的文件执行某些操作.