linux实现ll,Linux ll命令(ls -l)的代码实现

文件模式

这是个16位的2进制。最高4位表示文件类型,接下来3位依次是suid、sgid、sticky,后面的9位依次是user、group、other的读写执行标志。

文件类型:

1000    -    普通文件

0100    d    目录

0110    b    块设备

0010    c    字符设备

0001    p    命名管道

1010    l    符号链接

1100    s    套接字

文件可读意味着可以用cat命令查看,可写可以用vi打开。文件夹可执行则可以使用cd命令。

suid代表set-user-id,设置用户ID,即执行该文件的用户就像本文件的所有者一样。比如任何用户都可以通过password命令来修改自己的密码,但是存储密码的文件/etc/passwd的拥有者是root,其他用户是没有写权限的。而可执行文件/usr/bin/passwd的拥有者也是root,同时它的suid位上是1。则普通用户在运行/usr/bin/passwd的时候就成了root身份,既然是root身份自然对/etc/passwd拥有了写权限。那么passwd命令能不能修改其他用户的密码呢?不能!因为passwd命令会通过系统调用getuid来获得当前用户的ID,它只能修改这个ID用户的密码。如果文件拥有者本来具备写权限,同时suid位上是1,则相就位上的x会变成s;如果文件本来不是可执行文件,则相应位上会变成S。

sgid与suid类同。

sticky对文件和文件夹有不同的功用。sticky文件告诉系统要把文件放在swap区域。从交换空间加载程序比从普通磁盘区域加载要快,因为程序在硬盘上可能被分为好几块存放在许多不同的地方,而在交换空间上文件是不分块的。所以常用的程序如编辑器、编译器会放在交换空间。不过现在交换技术已经没那么重要了,取而代之的是虚拟内存,因为虚拟内存可以以更小的单位(如页page)进行交换。sticky使得一个目录里的文件只能被创建者删除,在/tmp目录里,谁都可以进行创建/删除文件。其他用户的x被替换这t,代表sticky被设置。

第二列显示链接数(硬链接),即指向该文件的引用次数。

第三列是文件所有者。/etc/passwd文件中包含用户列表,但它并没有包含所有的用户,因为在网络系统中,一台机器可以被很多用户登录,此时所有的用户信息都存储在一台叫作NIS的服务器上,所有的主机通过NIS进行身份验证。当然本地的/etc/passwd也存储了部分用户列表(这是NIS上用户列表的一个子集),以备离线操作。每个用户都有一个ID,该用户创建的文件有一个属性值就是此ID,这里就有一个问题,当用户被删除后,他创建的文件还在,如果后来又到了一个新用户,他刚好又被赋予了被删除的那个用户的ID,那么原先用户创建的文件归新用户所有。

第四列是文件拥有者所在的主组。不错,一个用户可以属于多个组。/etc/group里存储组列表。

第五列是文件大小。令我们好奇的是为什么上面三个文件夹的大小都是4096?这是因为目录所占的空间是以块为分配单位的,每块为512B。对于一般文件,则列出实际字节数。

第六列是文件的后面修改时间。

第七列是文件名。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值