编写程序实现 ls -l的功能:
#include<stdio.h>
int main()
{
struct stat buf;
int ret = 0;
struct passwd *pwd = NULL;
struct group *grp = NULL;
struct tm *ptm = NULL;
char* mon[12] ={"Jan","Feb","Mar","Apr","May","Jun","Jul","Oct","Nov","Oec","Nov","Dec"};
char tmpbuff[4096] = {0};
DIR *dp = NULL;
struct dirent *pp = NULL;
dp = opendir(".");
if(dp == NULL)
{
perror("fail to open\n");
return -1;
}
while(1)
{
//读取除隐藏文件以外的文件
pp = readdir(dp);
if(pp == NULL)
{
break;
}
if('.' == pp->d_name[0])
{
continue;
}
ret = lstat(pp->d_name,&buf);
if(ret == -1)
{
perror("fail to stat\\n");
return -1;
}
//判断文件类型
switch(buf.st_mode & S_IFMT)
{
case S_IFLNK:
putchar('l');
break;
case S_IFREG:
putchar('-');
break;
case S_IFBLK:
putchar('b');
break;
case S_IFDIR:
putchar('d');
break;
case S_IFCHR:
putchar('c');
break;
case S_IFIFO:
putchar('p');
break;
default:
perror("error");
}
//判断用户权限
//创建文件的用户的权限
buf.st_mode & S_IRUSR ? putchar('r') : putchar('-'); //位判断
buf.st_mode & S_IWUSR ? putchar('w') : putchar('-');
buf.st_mode & S_IXUSR ? putchar('x') : putchar('-');
//同组用户的权限
buf.st_mode & S_IRGRP ? putchar('r') : putchar('-');
buf.st_mode & S_IWGRP ? putchar('w') : putchar('-');
buf.st_mode & S_IXGRP ? putchar('x') : putchar('-');
//其他用户的权限
buf.st_mode & S_IROTH ? putchar('r') : putchar('-');
buf.st_mode & S_IWOTH ? putchar('w') : putchar('-');
buf.st_mode & S_IXOTH ? putchar('x') : putchar('-');
//判断硬连接的个数
printf(" %ld",buf.st_nlink);
//获取用户名
pwd = getpwuid(buf.st_uid);
if(pwd == NULL)
{
printf("%d",buf.st_uid); //打印用户ID
}
else
{
printf(" %s",pwd->pw_name);
}
//获取组名
grp = getgrgid(buf.st_gid);
if(grp == NULL)
{
printf("%d",buf.st_gid);//打印组ID
}
else
{
printf(" %s",grp->gr_name);
}
//获取文件大小,单位字节
printf(" %ld",buf.st_size);
//获取当前时间
ptm = localtime(&buf.st_mtime); //buf.st_mtime的类型是time_t
printf(" %s %d %d:%d",mon[ptm->tm_mon],ptm->tm_mday,ptm->tm_hour,ptm->tm_min);
//打印文件名称
printf(" %s",pp->d_name);
//打印软连接文件及其链接对象
if(S_ISLNK(buf.st_mode))
{
readlink(pp->d_name,tmpbuff,sizeof(tmpbuff)); //获取链接文件的内容
printf(" -> %s",tmpbuff);
}
putchar('\n');
}
return 0;
}