简洁的实现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
随机推荐
- centos6.5部署OpenStack单节点
环境 最小化安装的centos6.5 设置如下: 一.修改基本配置 1.修改主机名为controller [root@localhost ~]# hostname controller [root@l ...
- intent--Activity之间数据传递之Intent数据传递
intent传值: 4,intent传集合 3,intent传对象, 2,传递后有返回值的情况:当需要从目标Activity回传数据到原Activity时,可以使用上述方法定义一个新的Intent来传 ...
- [UE4]动态改变相机OrthWidh、关掉阴影
在制作缩略图的时候,每次都要手动不断尝试合适的OrthWidh,很是麻烦. 一.使用蓝图实现鼠标滚动动态改变OrthWidh.Get Ortho Width,Set Ortho Width 二.去掉阴 ...
- [UE4]移动惯性
2个因素影响滑行: 1.摩擦力:Ground Frition 2.减速度:Braking decelearation Walking
- Android接听、挂断电话
新建一个名为ITelephony的aidl文件,注意包名不能改变,因为是通过反射方式来实现接听和挂断的
- scipy构建稀疏矩阵
from scipy.sparse import csr_matrix import numpy as np indptr = np.array([0, 2, 3, 6]) indices = np. ...
- conda命令
- 好文推荐:转载一篇别人kaggle的经验分享
转载:https://www.toutiao.com/i6435866304363627010/ 笔者参加了由Quora举办的Quora Question Pairs比赛,并且获得了前1%的成绩.这是 ...
- Linux常用操作分享
Java开发经常遇到的linux相关操作 1.常用的上传下载(Xshell5) 1).get 从远程服务器上下载一个文件存放到本地,如下: 先通过lcd切换到本地那个目录下,然后通过get file ...
- firewalld的使用(CentOS7的端口打开关闭)
1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...