第一次的作业就把我难倒了。在此十分感谢JasonLeaster,没有这一系列的博文,我可能就要放弃了。希望能坚持下去,虽然比较难,但是我肯定能学到很多东西。
传送在此:http://blog.csdn.net/cinmyheart/article/details/45122619
不会的东西比较多,记录的东西也就比较多,比较杂。记下来先,慢慢熟悉。
看了JasonLeaster写的代码,差不多能理解个大概,也就真的是大概了。。
1、stat()函数与access()函数:获取文件信息。(参考的Jason的源代码,他使用了access()函数判断权限值,在我的代码里,删掉了此部分)
stat既有命令也有同名函数,用来获取文件Inode里主要信息(即文件类型、文件权限、创建/修改/访问时间等)。
struct stat
{
dev_t st_dev; /* ID of device containing file -文件所在设备的ID*/
ino_t st_ino; /* inode number -inode节点号*/
mode_t st_mode; /* 文件的类型和存取的权限*/
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 - */
};
其中, st_mode该成员描述了文件的类型和权限两个属性。
st_mode是个32位的整型变量,不过现在的linux操作系统只用了低16位。特征位的定义如下:
<sys/stat.h>头文件定义如下:
#define S_IFMT 00170000 文件类型的位遮罩
#define S_IFSOCK 0140000 socket
#define S_IFLNK 0120000 符号链接(symbolic link)
#define S_IFREG 0100000 一般文件
#define S_IFBLK 0060000 区块设备(block device)
#define S_IFDIR 0040000 目录
#define S_IFCHR 0020000 字符设备(character device)
#define S_IFIFO 0010000 先进先出(fifo)
#define S_ISUID 0004000 文件的(set user-id on execution)位
#define S_ISGID 0002000 文件的(set group-id on execution)位
#define S_ISVTX 0001000 文件的sticky位
#define S_IRWXU 00700 文件所有者的遮罩值(即所有权限值)
#define S_IRUSR 00400 文件所有者具可读取权限
#define S_IWUSR 00200 文件所有者具可写入权限
#define S_IXUSR 00100 文件所有者具可执行权限
#define S_IRWXG 00070 用户组的遮罩值(即所有权限值)
#define S_IRGRP 00040 用户组具可读取权限
#define S_IWGRP 00020 用户组具可写入权限
#define S_IXGRP 00010 用户组具可执行权限
#define S_IRWXO 00007 其他用户的遮罩值(即所有权限值)
#define S_IROTH 00004 其他用户具可读取权限
#define S_IWOTH 00002 其他用户具可写入权限
#define S_IXOTH 00001 其他用户具可执行权限
#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#define S_ISDIR(m) (((m) & S_