#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include<dirent.h>
#include<errno.h>
#include<time.h>
#include<pwd.h>
#include<grp.h>
#define MAX 32
char *get_mode1(mode_t c)
{
static char g[10]="";
char per[]="rwx";
for(int i=0;i<9;i++)
{
if((c&(0400>>i))==0)
{
g[i]='-';
continue;
}
g[i]=per[i%3];
}
return g;
}
void p_node(mode_t s)
{
switch(s&S_IFMT)
{
case S_IFBLK: putchar('b'); break;
case S_IFCHR: putchar('c'); break;
case S_IFDIR: putchar('d'); break;
case S_IFIFO: putchar('p'); break;
case S_IFLNK: putchar('l'); break;
case S_IFREG: putchar('-'); break;
case S_IFSOCK: putchar('s'); break;
default: printf("unknown?\n"); break;
}
}
void for_all(char *s)
{
struct stat bb;
if(stat(s,&bb)<0)
{
perror("stat");
return ;
}
// get_mode(bb.st_mode);
p_node(bb.st_mode);
printf("%s ",get_mode1(bb.st_mode));
printf("%ld",bb.st_nlink);
struct passwd* pwd=getpwuid(bb.st_uid);
if(NULL==pwd)
{
perror("getpwuid");
return ;
}
printf(" %s",pwd->pw_name);
struct group* grp=getgrgid(bb.st_gid);
if(NULL==grp)
{
perror("getgrgid");
return ;
}
printf(" %s",grp->gr_name);
printf(" %6ld ",bb.st_size);
time_t t=bb.st_ctime;
struct tm *info=NULL;
info=localtime(&t);
printf("%d月 %2d %02d:%02d",\
info->tm_mon+1,info->tm_mday,\
info->tm_hour,info->tm_min);
}
int main(int argc, const char *argv[])
{
DIR *dp=opendir("./");
if(dp==NULL)
{
perror("opendir");
return -1;
}
struct dirent *rp=NULL;
int count=1;
while(1)
{
rp=readdir(dp);
if(NULL==rp)
{
if(errno==0)
{
break;
}
else
{
perror("readdir");
return -1;
}
}
if(rp->d_name[0]=='.') continue;
for_all(rp->d_name);
printf(" %s\n",rp->d_name);
count++;
}
if(closedir(dp))
{
perror("closedir");
return -1;
}
return 0;
}
IO day4(getpwuid/getgrgid[类似ls -l])
于 2023-05-05 19:01:40 首次发布