我正在使用umask()
系统调用来设置文件权限。我正在使用以下代码:
umask(S_IWGRP | S_IWOTH);
printf("Enter file name that you want to create:");
scanf(" %s",file);
fd = open(file,O_CREAT|O_WRONLY);
但执行后,将使用以下给定的权限创建文件
--wS-----T 1 rvi rvi 0 Oct 2 15:20 test.txt
S
这一点点是T
干什么用的?为什么它会自动修改?
答案1
当您使用 O_CREAT 调用 open 时,它需要第三个参数来表示文件的模式。然后,umask 将从您请求的模式中屏蔽掉。因此,例如:
umask(S_IWGRP | S_IWOTH /* == 0022 */);
fd = open(file, O_CREAT|O_WRONLY, 0777);
将创建一个带有标志 0777 & (~0022) = 0755 的文件,即 rwxr-xr-x,而:
umask(S_IWGRP | S_IWOTH);
fd = open(file, O_CREAT|O_WRONLY, 0666);
将创建一个带有标志 0666 & (~0022) = 0644 的文件,即 rw-r--r--。在您的情况下,因为您没有提供模式参数,所以 open 函数会从堆栈中取出随机数据,因此您唯一知道的是用 umask 屏蔽的位将被关闭。尝试向公开呼叫提供您所需的模式; 0777 是可执行文件的不错选择,0666 是非可执行文件的不错选择。