• 操作系统第4次实验报告:文件系统


    • 姓名 :万大明
    • 学号 :201821121058
    • 班级 :计算1812

    1. 编写程序

    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <time.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <dirent.h>
    #include <fcntl.h>
    #include <pwd.h>
    #include <grp.h>
    
    void myls_l(char *pathname);
    
    int main(int argc, char *argv[])
    {
        char buf[1024] = "";                  //路径名
        //
        if(argc == 1)                         //没有输入其他参数时,打开当前目录
        {
            getcwd(buf, sizeof(buf));         //获得当前路径
            myls_l(buf);
        }
        else                                  //输入要展示的目录
        {
            myls_l(argv[1]);
            int i = 2;
            while(i < argc)
            {
                printf("
    ");
                myls_l(argv[i]);
                i++;
            }
        }
        return 0;
    }
    
    void myls_l(char *pathname)
    {
        DIR *cwd = NULL;                          //路径文件指针
        struct dirent *det = NULL;                //记录读到的文件信息
        struct stat statbuf = {0};                //记录文件的属性
        struct passwd *pwd = NULL;                //记录文件所属用户
        struct group *grp = NULL;                 //记录文件所属用户组
        struct tm mtm = {0};
    
        chdir(pathname);                            //!非常重要,否则无法获取文件属性
        //printf("%s
    ", buf);                       //输出当前路径
        cwd = opendir(pathname);                        //打开目录
        while(NULL != (det = readdir(cwd)))               //遍历当前目录
        {
            if(strncmp(det->d_name, ".", 1))
            {
                stat(det->d_name, &statbuf);
                //st_mode                                //文件类型
                if(S_ISREG(statbuf.st_mode))
                    printf("-");                         //普通文件
                else if(S_ISDIR(statbuf.st_mode))        
                    printf("d");                         //目录文件
                else if(S_ISCHR(statbuf.st_mode))
                    printf("c");                         //字符设备文件
                else if(S_ISBLK(statbuf.st_mode))
                    printf("b");                         //块设备文件
                else if(S_ISFIFO(statbuf.st_mode))
                    printf("p");                         //管理文件
                else if(S_ISLNK(statbuf.st_mode))
                    printf("l");                         //链接文件
                else if(S_ISSOCK(statbuf.st_mode))
                    printf("s");                         //套接字文件
                //st_mode                                   //文件权限
                if(statbuf.st_mode & S_IRUSR)
                    printf("r");
                else
                    printf("-");
                if(statbuf.st_mode & S_IWUSR)
                    printf("w");
                else
                    printf("-");
                if(statbuf.st_mode & S_IXUSR)
                    printf("x");
                else
                    printf("-");
    
                if(statbuf.st_mode & S_IRGRP)
                    printf("r");
                else
                    printf("-");
                if(statbuf.st_mode & S_IWGRP)
                    printf("w");
                else
                    printf("-");
                if(statbuf.st_mode & S_IXGRP)
                    printf("x");
                else
                    printf("-");
    
                if(statbuf.st_mode & S_IROTH)
                    printf("r");
                else
                    printf("-");
                if(statbuf.st_mode & S_IWOTH)
                    printf("w");
                else            
                    printf("-");
                if(statbuf.st_mode & S_IXOTH)
                    printf("x");
                else
                    printf("-");
                //st_nlink                                    //硬链接数
                printf("%2ld ", statbuf.st_nlink);
                //st_uid                                        //属主
                pwd = getpwuid(statbuf.st_uid);
                printf("%s ", pwd->pw_name);
                //st_gid                                      //属组
                grp = getgrgid(statbuf.st_gid);
                printf("%s ", grp->gr_name);
                //st_size                                      //文件大小
                printf("%5ld ", statbuf.st_size);
                //st_mtim                                       //最后修改时间
                localtime_r(&(statbuf.st_mtime), &mtm);
                printf("%d月", mtm.tm_mon + 1);
                printf("%4d ", mtm.tm_mday);
                printf("%02d:", mtm.tm_hour);
                printf("%02d ", mtm.tm_min);
                //st_name                                        //文件名
                printf("%s
    ", det->d_name);
            }
        }
        closedir(cwd);                                  //关闭目录
    }

    2. 分析运行结果

    给出运行结果截图,对于每一列是如何获取的,结合源代码做解释

    ls -lai运行结果:

    解释:total 392的意思为所列出内容的磁盘占用空间总和值为392kb .

     ./myla运行结果:

    结果解释:

     第一列解释(从“-”到第一列结束):r表示读权限,w表示写权限,x表示可执行权限,'-' 表示无权限

                                               1)第一排为文件类型,"-"和"p"分别表示此文件为普通文件和管理文件

                                                         代码实现为:

                                                              

                                               2)第二到三排(rwx)表示所有者及所有者权限

                                               3)第四到五排(r-x)表示组用户权限,即一个组中除所有者拥有的权限

                                               4)第六到七排(r-x)表示其他用户权限

                                                       代码实现为(代码过长截取部分):

                                                                  

    第二列表示文件连接数为‘1’,代码实现为:

                                                

    第三列表示用户名为“wandaming”,代码实现为:

                                                

    第四列表示组用户名为“jmu-cs-18”,实现代码为:

                                                

    第五列表示文件大小,实现代码为:

                                                

    第六七八列表示文件最后修改时间,实现代码为:

                                                

    第九列表示文件名称,实现代码为:

                                                

                           

    3. 通过该实验产生新的疑问及解答

    文件系统到底有什么用:

                1)存储空间管理

                2)目录管理

                3)读写管理和保护

                4)目标:提高外存储空间的利用率

  • 相关阅读:
    想想学习C已经有9年了, 应该可以写一些东西了.——转
    python gmail 多个收件人
    翻译_工具建议
    C语言的可变参数——转
    XP专业版中安装了IIS,配置好之后只能访问静态htm网页,图片之类的,但是ASP 文件确不能读取,提示无法显示网页提示
    ubuntu 修改IP,网关等
    java发送邮件
    在MyEclipse中配置Tomcat服务器
    国外程序员推荐:每个程序员都应读的书(转载)
    100个有关管理的网站
  • 原文地址:https://www.cnblogs.com/jiuyouir/p/12810847.html
Copyright © 2020-2023  润新知