操作系统第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)目标:提高外存储空间的利用率

原文地址:https://www.cnblogs.com/jiuyouir/p/12810847.html