gpt4 book ai didi

c - "Sticky bit"仅用于目录?我发现它可能在文件上,很奇怪

转载 作者:太空狗 更新时间:2023-10-29 11:35:49 31 4
gpt4 key购买 nike

来自网站的样本说“sticky bit”用于目录,例如

$ ll /tmp
drwxrwxrwt 16 root root 4096 1月 2 15:45 ./

我们可以看到/tmp的执行权限是“t”,任何人都可以执行,但某些目录只能由“root”或它的所有者操作。

所以我之前的理解是,这个文件权限标志只针对目录,不针对文件。但是,当我使用“打开”功能创建文件时遇到了这个问题,我没有指定任何文件权限作为第三个参数,所以我的程序是:

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

  1. 我是如何生成这个“T”标志的?我没有指定任何内容。
  2. 与小写的“t”有什么区别?

所以我继续我的实验,我删除了“write”语句,如下:

#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不同。

这种差异从何而来?我没有在程序中指定任何内容!

最佳答案

这是不正确的:

int f1=open("./mytest_c1.txt",O_CREAT|O_RDWR);

本声明invokes undefined behavior (UB)。每当您将 open(2) 与包含 O_CREAT 的标志一起使用时,您必须(如 manpages 中所述)指定文件模式。您看到的粘滞位是由于 UB 导致意外发生的结果。

现在,还有一些其他有趣的点:

We can see the execution permission of /tmp is "t", everyone can execute, but certain directories can be operated only by either "root" or its owner.

这没有错误,但有点误导。更准确地说,如果一个目录有粘性位(例如,/tmp 通常有),这意味着任何人都可以在该目录中创建文件,但是只有所有者(和 root,因为 root 几乎可以做任何事情)可以在创建文件后修改或排除该文件。

下一步:

The samples from web sites says "sticky bit" is for directories, e.g.

另外,没有再次错误,但有点误导。粘性位 can be applied to files , 但 Linux 会忽略它们。

关于c - "Sticky bit"仅用于目录?我发现它可能在文件上,很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41435657/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com