我正在尝试在C中重新创建UNIXls
作为学校练习的一部分。它必须完全支持-l
选项,并且其行为与原始选项一样。
顺便说一下,如果这有什么区别的话,我现在在OSX 10.8上。
从长格式部分理解MAN
的这一部分有困难。具体来说,我想知道同一行上的两个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
页面上的理解,我可以检查设置用户id模式,如:st_mode & 4000
并按如下方式设置组id模式:
st_mode & 2000
那我怎么检查这两个都设置好了?如果
st_mode & 2000
为真,st_mode & 4000
必须为假,对吗? 最佳答案
我很难从长格式部分理解这部分内容。
具体来说,我想知道同一条线上的两个假设是否。。。或者如果。。。或者如果。。。如果。。。
国际单项体育联合会是独立的。文件可以打开或关闭setuid位,也可以打开或关闭setgid位。手册页中的描述可能有点混乱,因为措辞非常简洁。这里有一个描述,希望会更清楚。有关位定义,请参阅stat.h手册页。
首先,考虑所有者位和setuid位。
如果所有者读取位打开,则输出ls
,否则输出r
。
如果所有者写入位打开,则输出-
,否则输出w
。
如果所有者可执行位为关且setuid位为开,则输出-
;否则,如果所有者可执行位为开且setuid位为开,则输出S
;否则,如果所有者可执行位为开,则输出s
,否则输出x
。
接下来,考虑组位和setgid位。
如果组读取位打开,则输出-
,否则输出r
。
如果组写入位打开,则输出-
,否则输出w
。
如果组可执行位为关且setgid位为开,则输出-
;否则,如果组可执行位为开且setgid位为开,则输出S
;否则,如果组可执行位为开,则输出s
,否则输出x
。
接下来,考虑其他位和S\ISVTX位。
如果另一个读取位打开,则输出-
,否则输出r
。
如果另一个写入位打开,则输出-
,否则输出w
。
如果文件是一个目录,而另一个可执行位为off,并且S_ISVTX位为on,则输出-
;否则,如果文件是一个目录,而另一个可执行位为on,且S_ISVTX位为on,则输出T
;否则,如果另一个可执行位为on,则输出t
,否则输出x
。
在某些版本的UNIX中,省略了“如果文件是一个目录”的要求,如果满足其他要求,则可以为普通文件输出-
或T
。
历史视角
最初,setuid、setgid和save文本位只对可执行文件有意义,因此长格式t
可以不用用ls
或x
替换s
标记,并且可以理解t
标记是隐含的。后来的UNIX版本允许setuid、setgid和save文本位对不可执行文件和目录具有不同的语义(通常是文件锁定、通过新文件继承目录组和限制删除),因此x
和S
标记被添加到T
的输出中。