zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    对于指定区块div,如何区分区块内的点击 和 区块外的点击?
    broadcom代码中httpd进程启动流程介绍
    一个简单的搜索布局样式
    一种在视频OBJECT标签上放置均分四个区域的框选方法
    JQuery执行DOM批量克隆并插入的提效方法
    DevOps技术路线图
    后端开发技术路线图
    Angular route传参
    Angular使用echarts
    TypeScript Array Remove
  • 原文地址:https://www.cnblogs.com/ringwang/p/1429814.html
Copyright © 2011-2022 走看看