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

  • 姓名:张皓落
  • 学号:201821121005
  • 班级:计算1811

1. 编写程序

在服务器上用Vim编写一个程序:实现Linux系统命令ls -lai的功能,给出源代码。

2. 分析运行结果

 

 运行结果分析:

从左至右依次

1.索引号

  

 

 2.文件属性

p:管理文件

结果分为3段:

第一段:所有者对该文件所具有的权限

第二段:所有者所在的组的其他用户所具有的权限

第三段:其他组的其他用户所具有的权限。

r(读取权限):具有读取文件内容的权限
w(写入权限):具有新增、修改文件内容的权限
x(执行权限):具有执行文件的权限

 

 

 

 3.目录文件,表示它的第一级子目录的个数

 

4.拥有者名称

 

5.文件所属组

 

 6.文件总字节数

 

 7.获取文件时间

 

 8.文件最后修改的时间

 

 

 9.文件名

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

文件的隐藏性如何设置?

(1)hattr命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”

         如果想要把某个隐藏功能移出文件,则需要追加“-参数”。

        参数{i,a,S,s,A,b,d,D.......}

(2)lsattr命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。在Linux系统中,文件的隐藏权限必须使用lsattr命令来查看

附录:源代码

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<errno.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
#include<dirent.h>
#include<glob.h>
#include<stdlib.h>

#define BUFSIZE 1024

int ls_l(const char *path);
static int num;

static char *buf_cat(const char *path, const char *name)
{
char *bufcat = malloc(BUFSIZE);
memset(bufcat,'\0',BUFSIZE);
strcpy(bufcat,path);
strcat(bufcat,"/");
strcat(bufcat,name);
return bufcat;
}
// 判断是否为隐藏文件
static int hide(const char *path)
{
if(*path == '.')
return 1;
else
return 0;
}

int ls_l_1(const char *path,const char *name,struct dirent *entry){
struct stat mystat;
struct passwd *pwd = NULL;
struct tm *tmp = NULL;
struct group *grp = NULL;
char *buf = NULL;
glob_t myglob;
char buf0[BUFSIZE]={};
struct stat mystat0;
buf = buf_cat(path,name);
if(lstat(buf, &mystat) == -1){
perror("stat()");
return 1;
}
if(hide(name) == 0){
printf("%ld \n",entry->d_ino);
}
num +=mystat.st_blocks/2;
switch(mystat.st_mode & S_IFMT){
case S_IFREG:
printf("-");
break;
case S_IFBLK:
printf("b");
break;
case S_IFDIR:
printf("d");
break;
case S_IFCHR:
printf("c");
break;
case S_IFSOCK:
printf("s");
break;
case S_IFLNK:
printf("l");
break;
case S_IFIFO:
printf("p");
break;
default:
break;
}

//所有者权限
if(mystat.st_mode & S_IRUSR)
putchar('r');
else
putchar('-');
if(mystat.st_mode & S_IWUSR)
putchar('w');
else
putchar('-');
if(mystat.st_mode & S_IXUSR){
if(mystat.st_mode &S_ISUID){
putchar('s');
}else
putchar('x');
}else
putchar('-');
//所属组权限
if(mystat.st_mode & S_IRGRP)
putchar('r');
else
putchar('-');
if(mystat.st_mode & S_IWGRP)
putchar('w');
else
putchar('-');
if(mystat.st_mode & S_IXGRP){
if(mystat.st_mode &S_ISGID){
putchar('s');
}else
putchar('x');
}else
putchar('-');
//其他人权限
if(mystat.st_mode & S_IROTH)
putchar('r');
else
putchar('-');
if(mystat.st_mode & S_IWOTH)
putchar('w');
else
putchar('-');
if(mystat.st_mode & S_IXOTH){
if(mystat.st_mode &S_ISVTX){
putchar('t');
}else
putchar('x');
}else
putchar('-');
//硬链接
printf(" %ld ",mystat.st_nlink);

//文件拥有者名
pwd = getpwuid(mystat.st_uid);
printf("%s ", pwd->pw_name);

//文件所属组
grp = getgrgid(mystat.st_gid);
printf("%s ",grp->gr_name);

//总字节个数
printf("%ld ", mystat.st_size);

//获取文件时间
tmp = localtime(&mystat.st_mtim.tv_sec);
//最后修改时间
if(tmp == NULL)
return 1;
strftime(buf, BUFSIZE, "%m月 %d %H:%M",tmp);
printf("%s ", buf);

//文件名
printf("%s ", name);

putchar('\n');
}
return 0;
}

// ls -lai
int ls_lai(const char *path)
{
DIR *dp = NULL;
struct dirent *entry = NULL;
struct stat mystat;
struct stat mystat0;
char buf[BUFSIZE] = {};
struct stat sstat;
if(lstat(path,&sstat) == -1){
perror("stat()");
return 1;
}
if(S_ISREG(sstat.st_mode)){
ls_l_1(".", path);
}else{
dp = opendir(path);
if(dp == NULL){
perror("opendir()");
return 1;
}
while(1){
entry = readdir(dp);
if(NULL == entry){
if(errno){
perror("readdir()");
closedir(dp);
return 1;
}
break;
}
ls_l_1(path, entry->d_name,entry);
}
printf("总用量:%d\n", num);
closedir(dp);
}
return 0;
}
int main(int argc, char *argv[])
{

char path[128] ;
getcwd(path,127);
ls_l(path);
return 0;
}

posted @ 2020-04-30 17:39  现世安稳  阅读(268)  评论(0编辑  收藏  举报