P表示命名管道:由mkfifo系统调用生成,因为fifo又叫做有名管道,所以用p来表示这个文件的类型,然而pipe系统调用虽然也是用来创建管道的,但是他创建的是无名管道,不会生成一个文件来标识该管道,而mkfifo所创建的管道则需要一个文件来表示,这也是为什么叫他有名管道的原因,既然是用来做标识的,那么他的大小为零就理所当然了。
s 表示套接字 /dev/log(UNIX domain)
该条目的后9个字符表示该文件的执行权限。RWX分别表示可读可写可执行,若要改为不可读就用-代替R,也可以用一组3位的二进制数来表示这些,比如111表示RWX,或者用十进制的7来表示。头三位是文件拥有用户的权限,文件拥有用户在后面的条目指出,中间三个表示那些和文件拥有用户在同一个组的用户的权限,后三个表示其他用户的权限。我们这里说的用户是登陆系统时的用户。当进程去操作文件时,系统就会检测进程的有效用户和有效组,若和文件的拥有用户或拥有组相同,就具备相应的权限。
另外还有重要的一点是文件的SUID和SGID。
首先我们知道一个进程里包含了该进程的实际用户,有效用户,实际组,有效组四个信息。一般情况下实际用户等于有效用户,实际组等于有效组。那么什么情况下会不一样呢?这就是我们接下来要说的了
当一个可执行文件的SUID被设置时,某个某个进程去执行他时,这个进程的有效用户就会变成这个文件的拥有用户,这个时候就不一样了。同样的,如果文件的SGID被设置了,那么进程在执行该文件时,有效组就会变成该文件的拥有者所在的用户,这个时候实际组和有效组就有可能不一样了。总之一个进程的实际用户和实际组是不会变的。
那么这样做是为了什么呢?
比如每个用户都有修改密码的需求,但是记录密码的文件是系统文件,只有root用户才能修改,那普通用户怎么修改呢?当我们修改密码时会执行一个passwd的程序,而passwd的SUID就被设置了!!!并且passwd这个程序的拥有者是root用户,所以在进程执行该程序时,进程的有效用户变成了root,和实际用户就不一样了。当该进程去修改系统文件(记录了密码的文件)时,系统就会检测该进程的有效用户是否等于该文件的拥有者用户,若是,则具备了读写功能。从而一个普通用户完成了修改密码的动作。
第二个条目是表示这个文件的引用计数,也可以说是这个文件的硬链接数,因为每有一个硬链接,这个数目就会+1,硬链接由ln命令生成,其本质就是给同一个文件起了若干种数目的名字,而这个数目就是这第二个条目―引用计数,有点像c++中的引用,给一个变量取了另外一个名字,然而实际上你操作的是同一个块内存,也就是说他们的地址是一样的。例如图中的‘’点‘’文件,其实他表示的就是当前所在目录的这个文件,而数字2就表示该文件硬链接数为2,说白了就是他有两个名字,一个改目录名,一个“点”。
第三个条目表示该文件拥有者的用户ID。
它是由创建该文件时,登陆系统的用户决定的。第四个条目表示该文件拥有者所在的组ID。
它是由创建该文件时,登陆系统的用户所在的组决定的。第五个条目表示该文件的大小。
后面的时间表示最后一次访问的时间,如果touch某个文件可以改变该时间为当前时间。