来自网站的样本说“粘性位”用于目录,例如
$ ll /tmp
drwxrwxrwt 16 root root 4096 1月 2 15:45 ./
我们可以看到/ tmp的执行权限是“t”,每个人都可以执行,但某些目录只能由“root”或其所有者操作。
所以我之前的理解是,此文件权限标志仅适用于目录,但不适用于文件。但是,当我使用“open”函数创建文件时,我遇到了这个问题,我没有指定任何文件权限作为第三个参数,所以我的程序是:
#include<fcntl.h>
#include<unistd.h>
int main()
{
int f1=open("./mytest_c1.txt",O_CREAT|O_RDWR);
write(f1,"abc xyz\n",8);
close(f1);
return 0;
}
执行后,我得到了一个这样的文件:
--wxr-x--T 1 x x 8 1月 2 11:38 mytest_c1.txt*
很奇怪,这是一个大写的“T”。
所以我继续我的实验,我删除了“写”语句,因为:
#include<fcntl.h>
#include<unistd.h>
int main()
{
int f1=open("./mytest_c2.txt",O_CREAT|O_RDWR);
close(f1);
return 0;
}
运行结果创建了另一个文件:
-rw---x--T 1 x x 0 1月 2 15:59 mytest_c2.txt*
这一次,奇怪的是。 mytest_c2.txt的文件权限与mytest_c1.txt不同。
这种差异来自哪里?我的程序中没有指定任何内容!
答案 0 :(得分:4)
这是不正确的:
int f1=open("./mytest_c1.txt",O_CREAT|O_RDWR);
此声明invokes undefined behavior(UB)。每当您对包含open(2)
的标记使用O_CREAT
时,必须(如manpages中所述)指定文件模式。您看到的粘性位是由于UB而发生意外情况的结果。
现在,其他一些有趣的观点:
我们可以看到/ tmp的执行权限是&#34; t&#34;,每个人都可以执行,但某些目录只能由&#34; root&#34;或其所有者。
这不是错误,但它有点误导。更确切地说,如果一个目录有一个粘滞位(例如,/tmp
通常会这样做),这意味着任何人都可以在该目录中创建文件,但只有所有者< / strong>(和root
,因为root
几乎可以执行任何操作)可以在文件创建后修改或排除。
下一步:
来自网站的样本说&#34;粘性位&#34;用于目录,例如
此外,没有错,但有点误导。粘性位can be applied to files,但Linux只是忽略它们。
答案 1 :(得分:1)
差异:表示粘滞位,在t
版本中,执行位置位且T
执行位未置位。
原因:Linux从父目录继承权限(如果在目录上设置ACL,则只有该目录中的文件继承ACL。如果创建子目录,除非ACL,否则不会获取父ACL设置为递归)所以在这种情况下,设置文件所在的文件夹...对于该粘滞位。这就是新创建的文件继承它的原因。
对于我的情况,ACL设置为递归。对于OP的情况也被设置为 recurse否则它不会继承父级的父级ACL。