简洁的实现ls-l命令
现在我们来简洁的实现命令:了解一下相关知识:
我们使用掩码可以很明确的得出文件的每一种信息。关于掩码,上图中的S_IRUSR等均为掩码。我们来看看函数getpwuid,原型:struct passwd *getpwuid(uid_t uid);头文件:#include <pwd.h>。
getpwuid()用来逐一搜索参数uid 指定的用户识别码, 找到时便将该用户的数据以结构体的形式返回。该函数的返回值是一个结构体passwd 。我们来看看这个结构体:
struct
passwd {
char *pw_name; /* username */
char *pw_passwd; /* user password */
uid_t pw_uid; /* user ID */
gid_t pw_gid; /* group ID */
char *pw_gecos; /* user information */
char *pw_dir; /* home directory */
char *pw_shell; /* shell program */
};
结构体已经很清楚明了了。所以我们很容易可以得到用户名。我们再来看另一个函数:getgrgid(),函数原型:struct group *getgrgid(gid_t gid);头文件:#include <grp.h>。和getpwuid类似。结构体group:
struct
group {
char *gr_name; /* group name */
char *gr_passwd; /* group password */
gid_t gr_gid; /* group ID */
char **gr_mem; /* NULL-terminated array of pointers
to names of group members */
};
所以文件所属组也很容易得到。
所以整体上很容易了:
#include
<stdio.h>
#include
<string.h>
#include
<sys/types.h>
#include
<sys/stat.h>
#include
<stdlib.h>
#include
<time.h>
#include
<pwd.h>
#include
<grp.h>
int main(int
argc, char* argv[])
{
if (argc < 2)
{
printf(". / a.out filename\n");
exit(1);
}
struct
stat st;
int ret = stat(argv[1], &st);
if (ret == -1)
{
perror("stat");
exit(1);
}
// 存储文件类型和访问权限
char perms[11] = { 0 };
// 判断文件类型
switch (st.st_mode & S_IFMT)
{
case
S_IFLNK:
perms[0] = 'l';
break;
case
S_IFDIR:
perms[0] = 'd';
break;
case
S_IFREG:
perms[0] = ' - ';
break;
case
S_IFBLK:
perms[0] = 'b';
break;
case
S_IFCHR:
perms[0] = 'c';
break;
case
S_IFSOCK:
perms[0] = 's';
break;
case
S_IFIFO:
perms[0] = 'p';
break;
default:
perms[0] = ' ? ';
break;
}
// 判断文件的访问权限
// 文件所有者
perms[1] = (st.st_mode & S_IRUSR) ? 'r' : ' - ';
perms[2] = (st.st_mode & S_IWUSR) ? 'w' : ' - ';
perms[3] = (st.st_mode & S_IXUSR) ? 'x' : ' - ';
// 文件所属组
perms[4] = (st.st_mode & S_IRGRP) ? 'r' : ' - ';
perms[5] = (st.st_mode & S_IWGRP) ? 'w' : ' - ';
perms[6] = (st.st_mode & S_IXGRP) ? 'x' : ' - ';
// 其他人
perms[7] = (st.st_mode & S_IROTH) ? 'r' : ' - ';
perms[8] = (st.st_mode & S_IWOTH) ? 'w' : ' - ';
perms[9] = (st.st_mode & S_IXOTH) ? 'x' : ' - ';
// 硬链接计数
int linkNum = st.st_nlink;
// 文件所有者
char* fileUser = getpwuid(st.st_uid)->pw_name;
// 文件所属组
char* fileGrp = getgrgid(st.st_gid)->gr_name;
// 文件大小
int fileSize = (int)st.st_size;
// 修改时间
char* time = ctime(&st.st_mtime);
char mtime[512] = { 0 };
strncpy(mtime, time, strlen(time) - 1);
char buf[1024];
sprintf(buf, "%s %d %s %s %d %s %s", perms, linkNum, fileUser, fileGrp, fileSize, mtime, argv[1]);
printf("%s\n", buf);
return 0;
}
简洁的实现ls-l命令的更多相关文章
- 实现Linux下的ls -l命令
基本实现了Linux下的ls -l命令,对于不同的文件显示不同的颜色和显示符号链接暂时没有实现: /************************************************** ...
- linux下ls -l命令(即ll命令)查看文件的显示结果分析
在linux下使用“ls -l”或者“ls -al”或者“ll”命令查看文件及目录详情时,shell中会显示出好几列的信息.平时也没怎么注意过,今天忽然心血来潮想了解一下,于是整理了这篇博客,以供参考 ...
- linux ls -l命令结果含义解析
ls -l 中显示的内容如下: -rw-r--r--. 1 root root 192 Jan 30 09:55 text.txt - 10个字符确定不同用户能对文件干什么 - 第一个字符代表文件 ...
- ls -l命令详解
输入: ls -l 输出: -rwxr-xr-x root root May : b 第一个字段(1个字符):文件类型 - :普通文件 d:目录文件 b:块设备文件(block) c:字符设备文件(c ...
- 高仿linux下的ls -l命令——C语言实现
主要用到的函数可以参考头文件,仅仅支持ls -l这功能,扩展就交给大家了0.0 相关测试图片: 话不多说,直接上码 #include <stdio.h> #include < ...
- 【转载】linux ls -l命令详解
Linux 文件或目录的属性主要包括:文件或目录的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容.具体情况如下: 命令: ls -lih 输出: [root@loca ...
- 模拟linux下的ls -l命令
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...
- linux下 ls -l 命令显示结果每一列代表什么意思
第一个栏位,表示文件的属性.Linux的文件基本上分为三个属性:可读(r),可写(w),可执行(x).但是这里有十个格子可以添(具体程序实现时,实际上是十个bit位).第一个小格是特殊表示格,表示目录 ...
- Linux中 ls -l 命令显示结果中的每一列的含义
图片转载自:https://blog.csdn.net/zhuoya_/article/details/77418413 简单解释下: 1.第一列颜色框:文件类型列,这里简单描述几种常见类型,d表示目 ...
- Linux 下 ls -l 命令执行显示结果的每一列含义【转载】
转自:zhuoya_的博客 原文地址>>https://blog.csdn.net/zhuoya_/article/details/77418413
随机推荐
- Jmeter(二十七)Jmeter Question 之“集成Ant+Jenkins自动化”
首先介绍一下Ant.Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.由Apache软件基金会所提供. 是的.还是Apache家 ...
- [UE4]更通用的接口,将UserWidget作为图标添加到小地图
将图标改成UserWidget添加到小地图,UserWidget支持动画特效,更丰富小地图的功能. 一.在小地图图标结构体中,将Flag数据类型改成UserWidget,删除ImageWidget(类 ...
- vs code编辑器格式化react jsx插件
vs code格式化jsx比较适合的插件是react-beautify: 格式化中遇到的问题是indent几格,这个问题的解决是你在space里设置几格这个插件就会自动格式化出几格.
- python数字
#=====>part1:数字类型#掌握:int,float#了解:Long(在python2中才有),complex# num=10# num=int(10)# print(type(num) ...
- ZooKeeper Installation(Dev)
ZooKeeper Installation Install ZooKeeper packages # -jre-headless # sudo apt-get install zookeeper z ...
- Java 6- Java 运算符
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 其他运 ...
- 锚点定位,jquery定位到页面指定位置
jquery锚点定位 $('body,html').animate({scrollTop: $('#ter1').offset().top}, 500);#ter1是你要定位的id对象,500是0.5 ...
- python连接数据库——create_engine和conn.cursor
python操作数据库的方法: 一种是导入sqlalchemy包,另一种是导入psycopg2包. 具体用法如下(此处以postgre数据库举例) 第一种: # 导入包 from sqlalchemy ...
- vuejs实现瀑布流布局(二)
瀑布流布局已然完成,那么剩下的就是另一个比较大的工程了——无限加载. 之前说了,这个活动项目是基于SUI-Mobile搭建的,所以可以直接使用sui内建组件“无限加载”来实现这个功能. 没有真实的数据 ...
- 初识vuejs
转行前端,时间也不短了,也见识到了前端行业的蓬勃发展,以及一些新鲜技术的层出不穷. 由于自身计算机基础的薄弱,更加上一直没有遇上一个公司力推新技术,所以一直以来基本上都是靠着jquery和则zepto ...