Linux 下 C 语言实现 ls -l 功能
需求:用 ls -l 显示文件夹下所有的文件及属性
分析:1 用 ls 显示文件夹下的所有文件,首先用 opendir 打开文件夹,再用
readdir 读取文件夹里面的文件,最后 closedir 关闭文件夹。
2 用 ls -l 比较复杂,打印出来的内容包括:(文件属性+文件名) 由以下
几部分构成——文件的类型(d——目录文件 -——文本文件...)文件的可执行
权限 所属组的权限,其它组的权限 硬链接数 文件拥有者 文件拥有者组 文件
大小 时间 文件名
解决方案:
1. 要想实现 ls -l 就得知道通过什么系统调用获取文件信息,首先自然是要通过
man 来查找相关的系统调用。
man -k file|grep status
man -k file|grep information
man -k file|grep info
通过上面的搜索就可以得到 stat 这个系统调用获取文件属性。
man 2 stat 获取系统调用的详细使用方法:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B 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 */
};
只要通过相应字段进行格式处理就行啦!
2.权限处理:st_mode 就是文件的权限部分。St_mode 本身就是一个 16 位的二进
制,前四位是文件的类型,紧接着三位是特殊权限,左后九位就是 ls -l 列出来
的九个权限。
linux 本身提供了很多测试宏来测试文件的类型的
#define __S_IFMT 0170000 /* These bits determine file type. */
/* File types. */
#define __S_IFDIR 0040000 /* Directory. */
#define __S_IFCHR 0020000 /* Character device. */
评论0