文件和目录这章,主要是围绕着一个结构体state展开的,
我们先看一下这个结构里里面有什么内容
struct stat { dev_t st_dev; /* ID of device containing file -文件所在设备的ID*/ ino_t st_ino; /* inode number -inode节点号*/ mode_t st_mode; /* file type &mode[permission]*/ nlink_t st_nlink; /* number of hard links -链向此文件的连接数(硬连接)*/ uid_t st_uid; /* user ID of owner -user id*/ gid_t st_gid; /* group ID of owner - group id*/ dev_t st_rdev; /* device ID (if special file) -设备号,针对设备文件*/ off_t st_size; /* total size, in bytes -文件大小,字节为单位*/ blksize_t st_blksize; /* blocksize for filesystem I/O -系统块的大小*/ blkcnt_t st_blocks; /* number of blocks allocated -文件所占块数*/ time_t st_atime; /* time of last access -文件最后访问时间*/ time_t st_mtime; /* time of last modification -文件数据最近修改时间*/ time_t st_ctime; /* time of last status change - i结点状态修改时间*/ };
从st_mode 开始说
1.文件的类型
类型很容易,众所周知UNIX的7中文件类型,经常用ls一定非常熟悉了,下面还是列举一下
1)普通文件 (regular fille) -
2) 目录文件 (directory file) d
3)块特殊设备 (block special file)b
4) 字符特殊设备 (character special file) c
5) FIFO 有时候也成为命名管道 named pipe
6) 套接字 (socket) s
7) 符号链接 (symbolic link) l
我们可以用宏 S_ISXXX(),来判断文件的类型,当然在此之前需要获得stat结构, state fstat lstat函数比较简单就不介绍了。
2.文件的访问权限
我们在ls -al 命令经常会看到这样的显示
drwxr-xr-x 15 root root 4100 9月 7 21:35 ./
rwxr-xr-x 表示了 所有者、组、其他人的权限
我么经常回使用chmod来改变访问权限,对于目录的访问权限由必要提一下,r表示对改目录有读的权限,即列出改目录下的文件列表,把目录想成一个文本文档其中的内容就是文件列表,这就很好理解,当然内部实现也差不多是这样。r 权限就明白就很清楚。然而对目录文件进行删除重命名等操作必须有wx权限,而且只有内核能够修改文件表,x权限是指当我的路径中存在该目录,/a/b/c/d/a.out 这样对于abcd 目录来说都需要x权限。
3.其他的位
1.S_ISUID
2.S_ISGID
3. S_ISVTX 粘住位 (如果对一个文件设置了粘住位,只有root或者所有者可以删除)
——————————————————
实际用户id (实际ID标示我们究竟是谁,access函数用来检查实际ID)
实际组 id
------------------------------------------------------
有效用户id
有效组id (决定文件访问权限)
附加组id
-------------------------------------------------------
保存设置用户id
保存设置组id (有效ID的副本,8.1介绍)
———————————————————
当用户执行一个程序时,进程的有效用户ID通常是实际用户ID,有效用户ID是实际用户ID,
如果设置st_uid,有效用户ID变成了这个程序文件所以者的ID,那么我们便可以通过这个程序获得所有者的权限,比如所有者是root.
一个例子就是:passwd命令。 我们用普通用户执行passwd命令,这个命令的所有者是root,而且设置了st_uid,那么执行这个程序我们便有了root权限,
可以对/etc/shadow文件写入操作。我们看一下shadow文件的权限。很神奇有木有,所以st_uid位设置需要非常谨慎。
同理:st_uid也类似。
S_ISUID,S_ISGID是一个常量用作检查st_uid和st_gid是否被设置,取自chmod中的mode常量
当创建新文件时,我们会设定文件的访问权限,最终的访问权限会和一个值进行&操作后得出最终的权限值。
这个值称为掩码加入掩码(022),比如777 &(~022)777&755= 755
我们用umask设置掩码。
然后将st_size,这个值表示文件的长度。
目录文件的 长度和目录的具体实现有关系,通常目录结构由 i节点和 目录名组成
对于符号链接来说,文件长度是是指向的文件的文件路径长度
普通文件就是内容的长度
大多unix 提供 st_blksize 和st_blocks,前者是对文件I/O操作较适合的长度,这样操作效率会较高。后者是实际分配的512字节块的数量.
接着讲文件系统,会介绍完剩下的属性
硬盘可以分成多个分区,每个分区有不同的文件系统。这里介绍一下unix的文件系统。