#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
#include<string.h>
//模拟实现ls-l指令
//-rw-rw-r-- 1 ethan ethan 12 4月 19 16:31 a.txt
int main(int argc,char * argv[])
{
if(argc<2)
{
printf("%s filename\n",argv[0]);
return -1;
}
struct stat st;
int ret = stat(argv[1],&st);
if(ret==-1){
perror("stat");
return -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;
//文件大小
long int fileSize=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 %ld %s %s",perms,linkNum,fileUser,fileGrp,fileSize,mtime,argv[1]);
printf("%s\n",buf);
return 0;
}
模拟实现ls-l
于 2022-04-19 18:57:17 首次发布