ls命令编写
学习编写ls命令,带参数 -l,
读取文件系统的信息要涉及到dirent.h头文件和相关函数
DIR* opendir(char *path); 打开目录,失败返回NULL
dirent* readdir(DIR* dir); 读取目录的记录,失败返回NULL
stat(direct* dir,stat *st); 读取每条记录的详细信息,失败返回-1
char* ctime(long); 将是数字串转换成字符时间函数,成功返回字符指针
char* getpwuid(int uid); 根据用户id返回用户名
char* getgrdgid(int gid); 根据组id返回组名
权限的转换方法见程序 规则见sys/stat.h和bits/stat.h头文件
该程序可以接收多各参数,效果同ls -l命令
参考unix/linux编程实践教程 编写
#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<dirent.h>
void errmsg(char *msg,char *msg2);
void do_ls(char *dir);
void do_stat_info(char *statname);
void do_file_info(char *file_name,struct stat *);
void mode_to_letters(int mode,char mode_str[]);
char *uid_to_name(uid_t); //define stat.h
char *gid_to_name(gid_t); //define stat.h
int main(int ac,char *av[])
{
if(ac==1)
do_ls(".");
else
while(--ac)
{
do_ls(*++av);
}
}
void errmsg(char *msg,char *msg2)
{
fprintf(stderr,"%s\n",msg);
perror(msg2);
exit(1);
}
void do_ls(char *dir)
{
DIR *dir_p;
struct dirent * dirent_p;
if((dir_p=opendir(dir))==NULL)
errmsg("can't open directory.",dir);
else
{
while((dirent_p=readdir(dir_p))!=NULL)
do_stat_info(dirent_p->d_name);
closedir(dir_p);
}
}
void do_stat_info(char *statname)
{
struct stat *statinfo; //can't use pointer,else malloc
statinfo=(struct stat *)malloc(sizeof(struct stat));
//stat(statname,statinfo);
if(stat(statname,statinfo)==-1)
perror(statname);
else
do_file_info(statname,statinfo);
free(statinfo);
}
void do_file_info(char *filename,struct stat *statinfo)
{
char mode_str[11];
mode_to_letters(statinfo->st_mode,mode_str);
printf("%-10s ",mode_str);
printf("%4d ",statinfo->st_nlink);
printf("%-8s ",uid_to_name(statinfo->st_uid));
printf("%-8s ",gid_to_name(statinfo->st_gid));
printf("%8d ",statinfo->st_size);
printf("%.12s ",4+ctime(&statinfo->st_mtime));//sub from 4 to 12 letters
printf("%s\n",filename);
}
void mode_to_letters(int mode,char mode_str[])
{
strcpy(mode_str,"----------");
if(S_ISDIR(mode)) mode_str[0]='d';
if(S_ISCHR(mode)) mode_str[0]='c';
if(S_ISBLK(mode)) mode_str[0]='b';
if(S_IRUSR & mode) mode_str[1]='r';
if(S_IWUSR & mode) mode_str[2]='w';
if(S_IXUSR & mode) mode_str[3]='x';
if(S_IRGRP & mode) mode_str[4]='r';
if(S_IWGRP & mode) mode_str[5]='w';
if(S_IXGRP & mode) mode_str[6]='x';
if(S_IROTH & mode) mode_str[7]='r';
if(S_IWOTH & mode) mode_str[8]='w';
if(S_IXOTH & mode) mode_str[9]='x';
}
#include<pwd.h>
char *uid_to_name(uid_t uid)
{
struct passwd *getpwuid(),*pwd;
char *name_str;
if((pwd=getpwuid(uid))==NULL)
{
sprintf(name_str,"%d",uid); //redirct output
return name_str;
}
else
return pwd->pw_name;
}
#include<grp.h>
char *gid_to_name(gid_t gid)
{
struct group *getgrgid(),*gr;
char *name_str;
if((gr=getgrgid(gid))==NULL)
sprintf(name_str,"%d",gid); //redirect output
else
return gr->gr_name;
return name_str;
}