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目录了。