100 likes | 237 Views
实验 4 编写自己的 ls 命令. 计算机学院 潘薇 panwei117@qq.com. 实验内容. 在 Linux 下编写一个 C 程序 myls 基本完成“ ls –l” 的功能 打印一个文件的信息的功能使用函数 showfile 进行封装. 问题 1 : ls –l 能做什么?. 遍历当前目录的所有文件 列出每一个文件的相关属性 权限模式 链接数 文件所有者 组 文件大小 最后修改时间 文件名. 问题 2 :遍历当前目录文件使用什么函数?. opendir(“.”) 打开当前目录 readdir 读取目录中的一项
E N D
实验4 编写自己的ls命令 计算机学院 潘薇 panwei117@qq.com
实验内容 • 在Linux下编写一个C程序myls • 基本完成“ls –l”的功能 • 打印一个文件的信息的功能使用函数showfile进行封装
问题1:ls –l能做什么? • 遍历当前目录的所有文件 • 列出每一个文件的相关属性 • 权限模式 • 链接数 • 文件所有者 • 组 • 文件大小 • 最后修改时间 • 文件名
问题2:遍历当前目录文件使用什么函数? • opendir(“.”)打开当前目录 • readdir读取目录中的一项 • closedir关闭打开的目录 • stat用于获取具体的文件信息
问题3:stat可以获取哪些文件属性? struct stat { mode_t st_mode; /* 文件模式*/ ino_t st_ino; /* 文件inode号 */ dev_t st_dev; /* 文件驻留的逻辑设备ID*/ dev_t st_rdev; /*设备的ID*/ nlink_t st_nlink; /*文件的链接数*/ uid_t st_uid; /*文件拥有者的用户ID*/ gid_t st_gid; /*文件拥有者组的ID*/ off_t st_size; /*文件逻辑长度*/ time_t st_atime; /*文件最后一次访问时间*/ time_t st_mtime; /*文件最后一次修改时间*/ time_t st_ctime; /*文件状态信息最后修改时间*/ long st_blksize; /*I/O预取块大小*/ long st_blocks; /*块预留数*/ }
问题4:st_mode的翻译? • 对使用stat函数返回的st_mode是一个16位的二进制数,可以使用宏定义进行翻译文件类型和权限,得到10个字符形式的属性 • S_ISDIR(st_mode) 该文件是否是目录 • S_ISCHR(st_mode) 该文件是否是字符设备 • S_ISBLK(st_mode) 该文件是否是块设备
问题4:st_mode的翻译? • st_mode & S_IRUSR为真,用户有读权限 • st_mode & S_IWUSR为真,用户有写权限 • st_mode & S_IXUSR为真,用户有执行权限 • st_mode & S_IRGRP为真,组用户有读权限 • st_mode & S_IWGRP为真,组用户有写权限 • st_mode & S_IXGRP为真,组用户有执行权限 • st_mode & S_IROTH为真,其他用户有读权限 • st_mode & S_IWOTH为真,其他用户有写权限 • st_mode & S_IXOTH为真,其他用户有执行权限
问题5:怎么翻译st_uid? • 使用函数struct passwd * getpwuid(st_uid)来进行翻译,请注意需要判断返回指针是否为空 • struct passwd{ • char *pw_name; //username • char *pw_passwd; //password • _uid_t pw_uid; //user id • _gid_t pw_gid; //group id • char *pw_gecos; //real name • char *pw_dir; //home directory • char *pw_shell; //shell program • }
问题6:怎么翻译st_gid? • 使用函数struct group * getgrgid(st_gid)来进行翻译,请注意需要判断返回指针是否为空 • struct group{ • char *gr_name; //group name • char *gr_passwd; //group password • gid_t gr_gid; //group id • char **gr_mem; //group members • }
问题7:时间翻译 • 使用ctime翻译st_mtime为字符串格式