int lstat(const char *path,struct stat*buf)
当文件是一个符号链接时,lstat返回的是该符号链接本身的信息,而stat返回的是该链接指向的文件的信息。
struct stat {dev_t st_dev; //设备号码ino_t st_ino; //inode节点号mode_t st_mode; //文件对应的模式,文件,目录,sock,管道等等nlink_t st_nlink; //文件的连接数 软连接或硬链接uid_t st_uid; //文件所有者gid_t st_gid; //文件所有者对应的组dev_t st_rdev; //特殊设备号码off_t st_size; //普通文件,对应的文件字节数timestruc_t st_atim; //文件最后被访问的时间timestruc_t st_mtim; //文件内容最后被修改的时间timestruc_t st_ctim; //文件状态改变时间blksize_t st_blksize; //文件内容对应的块blkcnt_t st_blocks; //文件内容对应的块数量char st_fstype[_ST_FSTYPSZ]; };
stat结构体中的st_mode则定义了下列数种情况
S_IFMT | 0170000 | 文件类型的位遮罩 |
S_IFSOCK | 0140000 | socket |
S_IFLNK | 0120000 | 符号链接 |
S_IFREG | 0100000 | 一般文件 |
S_IFBLK | 0060000 | 区块装置 |
S_IFDIR | 0040000 | 目录 |
S_IFCHR | 0020000 | 字符装置 |
S_IFIFO | 0010000 | 先进先出 |
S_ISUID | 04000 | 文件的(set user-id on execution)位 |
S_ISGID | 02000 | 文件的(set group-id on execution)位 |
S_ISVTX | 01000 | 文件的sticky位 |
S_IRUSR(S_IREAD) | 00400 | 文件所有者具有可读权限 |
S_IWUSR(S_IWRITE) | 00200 | 文件所有者具有可写权限 |
S_IXUSR(S_IEXEC) | 00100 | 文件所有者具有可执行权限 |
S_IRGRP | 00040 | 用户组具有可读权限 |
S_WGRP | 00020 | 用户组具有可写权限 |
S_IXGRP | 00010 | 用户组具有可执行权限 |
S_IROTH | 00004 | 其他用户具有可读权限 |
S_IWOTH | 00002 | 其他用户具有可写权限 |
S_IXOTH | 00001 | 其他用户具有可执行权限 |
上述文件类型在POSIX中定义了检查这些类型的宏定义
S_ISLNK (st_mode) | 判断是否为符号链接 |
S_ISREG (st_mode) | 判断是否为一般文件 |
S_ISDIR(st_mode) | 是否为目录 |
S_ISCHR(st_mode) | 是否为字符装置文件 |
S_ISBLK(st_mode) | 是否为先进先出 |
S_ISSOCK(st_mode) | 是否为socker |
若一般目录具有sticky位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来输出或改名,在linux中,最典型的就是/tmp目录了。