创建的可执行文件gcc
有执行权限
-rwxrwxr-x
这与源文件具有的权限不同。
-rw-rw-r--
如何gcc
设置这些权限?
答案1
有四件事会影响确定文件的权限。
- 当应用程序创建文件时,它会指定一组初始权限。这些初始权限作为参数传递系统调用创建文件(
open
对于常规文件,mkdir
用于目录等)。 - 权限被隐藏掩码,这是正在运行的进程的一个属性。 umask 指示从应用程序指定的权限中删除的权限位。例如,umask
022
删除组写入和其他写入权限。 umask007
保留组写权限,但使该文件完全禁止其他人访问。 - 权限可以通过以下方式进一步修改访问控制列表。我不会在这篇文章中进一步讨论这些。
- 应用程序可以
chmod
显式调用以将权限更改为它想要的任何内容。拥有文件的用户可以自由设置其权限。
步骤 1 的一些流行的权限集选择是:
- 666(即每个人都可以读写)用于常规文件。
- 600(即读写,仅适用于所有者)对于必须保持私有的常规文件(例如电子邮件或临时文件)。
- 777(即为每个人读取、写入和执行)用于目录或可执行常规文件。
即使应用程序可以并且通常确实在文件创建权限中包含其他写入权限,但 umask 会导致文件不可读。
对于 gcc,首先使用权限 666 创建输出文件(由 umask 屏蔽),然后对其进行 chmod 使其可执行。 Gcc 可以直接创建可执行文件,但事实并非如此:它仅在完成写入后才使文件可执行,这样您就不会冒险在程序不完整时开始执行该程序。
答案2
我不确定你在问什么;你的意思是它如何有权设置它们?文件的所有者可以将权限设置为他们想要的任何内容。gcc
在您的用户帐户下运行,因此它创建的文件归您所有,并且它有权执行您的帐户可以执行的任何操作,包括设置文件的权限
答案3
正如 @AshRj 上面的评论所说,这取决于帐户设置的默认权限。本质上,所做的就是从所有权限(特别是包括x
用户/组/其他权限)开始,然后关闭指定的权限umask(2)
(另请参阅bash(1)
)。今天(每个用户都有自己的私有组)umask
通常设置为 002(仅拒绝w
其他用户),因此可执行文件的权限结果为rwxrwxr-x
,与源上的权限无关。如果创建其他文件(例如由编辑器创建),则x
根本没有启动权限(不应运行随机文本文件),因此权限将变为rw-rw-r--
.