我正在尝试在C中重新创建UNIXls作为学校练习的一部分。它必须完全支持-l选项,并且其行为与原始选项一样。
顺便说一下,如果这有什么区别的话,我现在在OSX 10.8上。
从长格式部分理解MAN的这一部分有困难。具体来说,我想知道同一行上的两个ifIF ... 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可以不用用lsx替换s标记,并且可以理解t标记是隐含的。后来的UNIX版本允许setuid、setgid和save文本位对不可执行文件和目录具有不同的语义(通常是文件锁定、通过新文件继承目录组和限制删除),因此xS标记被添加到T的输出中。

09-08 00:57