作为学校练习的一部分,我正在尝试用 C 重新创建 UNIX ls
。它必须完全支持 -l
选项,并且行为与原始选项一样。
顺便说一下,我使用的是 OSX 10.8,如果这有什么不同的话。
我无法理解 MAN
的这一部分,来自 Long Format 部分。具体来说,我想知道同一行上的两个 if
是 IF ... OR IF ...
还是 IF ... AND IF 。 ..
:
The first of the following that applies:
S If in the owner permissions, the file is not executable and set-user-ID mode is set. If in the group permissions, the file is not executable and set-group-ID mode is set.
s If in the owner permissions, the file is executable and set-user-ID mode is set. If in the group permissions, the file is executable and setgroup-ID mode is set.
据我从 man 2 stat
页面了解,我可以检查 set-user-id 模式,例如:
st_mode & 4000
像这样设置组 ID 模式:
st_mode & 2000
那么如何检查两者是否都已设置?如果 st_mode & 2000
为真,st_mode & 4000
一定是假的吧?
最佳答案
I'm having trouble understanding this part of the MAN, from the Long Format section. Specifically, I'm wondering if the two ifs on the same lines are IF ... OR IF ... or IF ... AND IF ...
IF 是独立的。文件可以打开或关闭 setuid 位,也可以打开或关闭 setgid 位。 ls
手册页中的描述可能有点困惑,因为措辞非常简洁。这是一个希望更清楚的描述。引用stat.h位定义的手册页。
首先,考虑所有者位和 setuid 位。
- 如果所有者读位是on,输出
r
,否则输出-
。 - 如果所有者写位打开,输出
w
,否则输出-
。 - 如果所有者可执行位关闭且 setuid 位打开,则输出
S
,否则如果所有者可执行位打开且 setuid 位打开,则输出s
,否则如果所有者可执行位打开,则输出x
,否则输出-
。
- 如果所有者读位是on,输出
接下来,考虑组位和 setgid 位。
- 如果组读位为on,则输出
r
,否则输出-
。 - 如果组写位打开,输出
w
,否则输出-
。 - 如果组可执行位关闭且setgid位打开,输出
S
,否则如果组可执行位打开且setgid位打开,输出s
, else 如果组可执行位打开,输出x
,否则输出-
。
- 如果组读位为on,则输出
接下来,考虑其他位和 S_ISVTX 位。
- 如果另一个读位是on,输出
r
,否则输出-
。 - 如果另一个写位打开,输出
w
,否则输出-
。 - 如果文件是目录且其他可执行位关闭且 S_ISVTX 位打开,则输出
T
,否则如果文件是目录且其他可执行位打开且 S_ISVTX位打开,输出t
,否则如果其他可执行位打开,输出x
,否则输出-
。 - 在某些版本的UNIX中,省略了“如果文件是目录”的要求,如果其他要求,普通文件可以输出
T
或t
满足。
- 如果另一个读位是on,输出
历史视角
最初,setuid、setgid 和 save-text 位仅对可执行文件有意义,因此长格式 ls
可以通过将 x
标记替换为s
或 t
,据了解,x
标签是隐含的。 UNIX 的后来修订版允许 setuid、setgid 和 save-text 位对不可执行文件和目录具有不同的语义(通常,文件锁定、新文件对目录组的继承以及限制删除),因此 S
和 T
标签被添加到 ls
的输出中。
关于c - 理解 `man ls` 长格式 : set-user-id and set-group-id modes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20238771/