实验4(文件系统)
04设置NTFS文件系统

【实验目的】
1)掌握NTFS文件权限的设置。
2)掌握NTFS磁盘配额的设置。
3)掌握NTFS中数据加/解密和压缩/解压缩的设置。
【实验境】
具有Windows2000 Server的计算机、局域网环境。
【实验重点及难点】
重点:掌握NTFS文件权限、磁盘配额、数据加/解密和压缩/解压缩的设置。
1)打开”我的电脑”选择”D盘”右击属性选择”磁盘配额”。如图4-9。
图4-9
2)勾选”启动磁盘配额”选中”配额项”在配额项中”新建配额项”将磁盘空间限制为10MB.如图4-10.
图4-10
3)注销,用Guest帐号登陆系统,则出现如图4-11。
图4-11
4)操作完成。
三、NTFS中数据加/解密和压缩/解压缩的设置。
图4-2
3)选择”权限”栏,勾选”读取”,点击”确定”。
图4-3
4)打开”我的电脑”中的”D盘”,并在该分区中”新建文件夹”,弹出如图4-4所示.
图4-4
5)操作完成.
2、设置Guest帐号对禁止删除D盘中的”新建文件夹”。
1)打开”我的电脑”右击属性选择”安全”。如图4-1。
2)删除Everyone用户,选择”添加”(如图4-5)双击”Guest”帐号,点击”确定”。
难点:实验过程中,切实理解NTFS的功能。
【实验内容】
一、NTFS文件权限的设置。
1、设置Administrator帐号对D盘读取权限。
1)打开”我的电脑”选择”D盘”右击属性选择”安全”。如图4-1。
图4-1
2)删除Everyone用户,选择”添加”(如图4-2)双击”Administrator”帐号,点击”确定”。
实验四Linux系统的磁盘管理..

iocharset=gb2312) - o loop 挂载ISO文件时用
例:mount -o iocharset=cp936 /dev/sda1 /mnt/usb (以保证 正常显示中文字符)
1.文件系统加载
2.磁盘管理基本命令
1. dd命令
功能:
从标准输入、文件或设备读取数据,依照指定的格式来转换数据, 再输出 至文件、设备或标准输出。
命令的格式:
dd [OPTION]...
实用例子:
把一张软盘的内容拷贝到另一张软盘上,利用/tmp/tmpfile作为临时存储文 件 1.把源盘插入驱动器中: $ dd if=/dev/fd0 of=/tmp/tmpfile 2.将源盘从驱动器中取出,把目标盘插入: $ dd if=/tmp/tmpfile of=/dev/fd0 3.软盘拷贝完成后,应该将临时文件删除: $ rm /tmp/tmpfile
-s -a
对每个FILE参数只给出占用的数据块总数。 递归地显示指定目录中各文件及子孙目录中各文件占用的数据块数。 若既不指定-s,也不指定-a,则只显示FILE中的每一个目录及其中 的各子目录所占的磁盘块数。 以字节为单位列出磁盘空间使用情况(系统缺省以k字节为单位)。 以1024字节为单位列出磁盘空间使用情况。 最后再加上一个总计(系统缺省设置)。 计算所有的文件大小,对硬链接文件,则计算多次。 跳过在不同文件系统上的目录不予统计。
1.文件系统加载
mount命令的格式
在一般情况下,本节的命令需要您有root身份才能执行。
mount命令可以加载文件系统到指定的挂接点。
mount [-t vfstype] [-o optoins] device dir
实验四 有关文件的程序设计

实验四有关文件的程序设计一、实验目的1.掌握磁盘文件建立的方法,能进行数据文件的输入和输出。
2.能熟练运用文件处理函数:fopen,fclose,fread,fwrite,fseek,ftell 等函数的使用。
3.掌握包含文件操作的程序设计和调试方法。
二、实验要求1. 复习文件、文件指针的概念;2. 复习有关命令行参数使用方法;3. 完成各项实验任务及问题讨论。
三、实验内容1.下面的程序建立文件file1.txt,运行程序,若有错误,请修改。
#include "stdio.h"void main(){FILE *fp; /*建立文件指针*/char string[81];if(fp=fopen("file1.txt","w")==NULL) /*打开文件 */{printf("can't open this file");exit(-1);}while(strlen(gets(string))>0) /*写字符串到文件*/{fputs(string,fp);fputs("\n",fp);}fclose(fp); /*关闭文件*/}2. 根据功能要求,完善程序。
①以下程序的功能是将1中文件file1.txt的内容输出到屏幕上并复制到文件file2. txt中。
#include “stdio.h”main(){FILE ;fp1=fopen(“file1. txt”,”r”);fp2=fopen(“file2. txt”,”w”);while(!feof(fp1)) putchar(getc(fp1));while(!feof(fp1)) putc( )fclose(fp1);fclose(fp2); }②下面程序的功能是将从终端上读入的10个整数以二进制方式写入名为“bi.dat”的新文件中。
LINUX实验报告(4)

首先输入cd /run/media/clz进入U盘分区
拷贝zll文件到a目录下面:cp -R zll ./a
拷贝b目录到a目录:cp -R b ./a
移动zll文件到b:输入mv -i zll ./b
移动目录b到目录a:输入mv -i b ./a
2.文件系统使用实验:
在上面创建的分区中分别使用命令创建目录和文件、拷贝文件和目录、移动文件和目录、删除文件和目录、修改文件和目录的名称、修改文件和目录的权限、查找文件和目录。
创建目录:mkdir -p /run/media/U盘名称/目录名
创建文件:输入vi /run/media/U盘名称/文件名
(3)使用fsck命令和badblocks命令检查文件系统、标注坏扇区;
输入fsck -t /dev/sdb1检查文件系统:
输入badblocks -s -v /dev/sdb1检查坏扇区
(4)使用mount命令装载文件系统。
先输入mkdir -p /mnt/usb建立一个文件作为挂接点,然后输入mount -t vfat/dev/sdb1 /mnt/usb挂载。
实验总结:
一开始对linux的分区命令不是很了解,总是出错,而且U盘也总是挂载不上,最后换了个U盘才挂载上的,还有就是对Linux操作系统的文件和目录管理的操作命令不是很熟,有待加强,自己在课下也需要多加练习。
实验总结:
删除目录a下的zll文件:rm a/zll
删除目录a下的b目录:rm -R a/b
在分区创建zll文件
修改zll文件的名称为cz:mv zll cz
修改目录a的名称为c:mv a c
修改zll文件的权限为可读、可写、可执行:chmod 777 zll
国开 操作系统 实验4:文件管理实验

实验4:文件管理实验
一、目的:
1、加深对文件、目录、文件系统等概念的理解。
2、掌握Linux 文件系统的目录结构。
3、掌握有关Linux 文件系统操作的常用命令。
4、了解有关文件安全性方面的知识。
二、条件:
需要一个Linux的环境
1、在Win10系统启用Linux子系统
2、在Win10应用商店安装Ubuntu应用
3、
三、过程:
1、浏览文件系统
用到pwd、ls、mkdir、cd命令
不带参数的cd命令,工作目录回到了用户的默认目录
cd ../.. 执行后,工作目录回到了/根目录
2、查看文件
用到data、head、tail、ls、man、date、cp、mv、rm命令
man date
建立链接后第2个字段从1变成2
3、文件查找和目录
用到了find、grep命令
4、修改文件存取权限
chmod命令
四、总结:Linux是一个多用户的现代操作系统,提供了丰富和强大的文件管理的命令。
掌握这些命令对于我们深入Linux学习是必需的。
操作系统教学实践(3篇)

第1篇一、引言操作系统是计算机科学与技术领域的重要基础课程,它涉及计算机系统的资源管理、进程管理、存储管理、文件系统等多个方面。
为了提高学生对操作系统的理解和掌握程度,本文将从教学实践的角度,探讨如何进行操作系统教学。
二、教学目标1. 使学生掌握操作系统的基本概念、原理和关键技术;2. 培养学生分析和解决实际问题的能力;3. 增强学生的团队协作和创新能力;4. 提高学生的编程能力和动手能力。
三、教学内容1. 操作系统概述:介绍操作系统的定义、发展历程、分类和特点;2. 进程管理:讲解进程的概念、进程状态、进程调度算法和进程同步与互斥;3. 存储管理:分析内存分配策略、页面置换算法和虚拟内存技术;4. 文件系统:探讨文件系统的概念、目录结构、文件操作和存储设备管理;5. 设备管理:介绍设备的分类、驱动程序、I/O控制方式和中断处理;6. 网络操作系统:讲解网络操作系统的基本概念、网络协议、网络设备管理和网络安全。
四、教学实践1. 案例教学:通过实际案例,引导学生分析操作系统的原理和应用。
例如,以Linux系统为例,讲解进程调度、内存管理和文件系统等知识点。
2. 实验教学:设计实验项目,让学生动手实践操作系统的相关知识。
实验项目包括:(1)进程调度实验:让学生编写进程调度算法,实现进程的创建、调度和同步。
(2)内存管理实验:让学生实现内存分配、页面置换和虚拟内存等技术。
(3)文件系统实验:让学生实现文件系统的目录结构、文件操作和存储设备管理。
(4)设备管理实验:让学生编写设备驱动程序,实现设备的控制和管理。
3. 项目教学:以实际项目为背景,让学生分组完成项目开发。
项目可以包括:(1)操作系统模拟器:让学生模拟操作系统的运行过程,加深对操作系统原理的理解。
(2)嵌入式操作系统开发:让学生了解嵌入式操作系统的特点,掌握嵌入式开发技能。
(3)分布式操作系统开发:让学生了解分布式系统的原理,掌握分布式操作系统的开发方法。
实验四 磁盘和文件系统管理心得

实验四磁盘和文件系统管理心得前言实验四主要涉及磁盘和文件系统的管理,通过对磁盘分区、文件系统格式化、文件的创建、删除和修改等操作,我们能够更好地理解和掌握磁盘和文件系统的相关概念和原理。
本文将从以下几个方面对实验四的心得进行全面、详细、完整且深入地探讨。
磁盘分区的原理与方法磁盘分区是指将一个物理硬盘分成多个逻辑区域的操作。
通过对磁盘进行合理分区,可以充分利用磁盘空间,并为不同用途的数据提供不同的存储空间。
磁盘分区有两种常见的方法:主引导记录(Master Boot Record,MBR)分区和GUID分区表(GUID Partition Table,GPT)。
MBR分区MBR分区是一种传统的分区方式,适用于BIOS引导的系统。
MBR分区表将硬盘的第一个扇区(512字节)用于存储分区表的信息,包括主引导记录、分区表项等。
MBR分区最多支持4个主分区或3个主分区加一个扩展分区。
其中,扩展分区可以进一步划分逻辑分区。
GPT分区GPT分区是一种新的分区方式,适用于UEFI引导的系统。
GPT分区通过GUID(全局唯一标识符)来标识分区,解决了MBR分区的一些限制,如只能支持最多4个主分区等。
GPT分区表存储在硬盘末尾的一个独立区域,可以容纳更多的分区信息。
文件系统的选择与格式化文件系统是操作系统用来管理和组织文件的一种方式。
常见的文件系统有FAT32、NTFS、ext4等。
在进行文件系统格式化之前,我们需要选择适合自己需求的文件系统。
FAT32文件系统FAT32是一种通用的文件系统,在各个操作系统中都能够良好地兼容。
它支持的单个文件最大为4GB,簇大小可以灵活配置。
然而,FAT32文件系统对于大容量硬盘的利用率较低,而且不支持文件权限和加密等高级功能。
NTFS文件系统NTFS是Windows操作系统中常用的文件系统,它支持大容量硬盘,单个文件最大支持16TB。
NTFS文件系统具有更高的稳定性和安全性,支持文件权限、加密和压缩等功能。
实验4HDFS常用操作

实验4HDFS常用操作Hadoop分布式文件系统(HDFS)是一个高度可靠、可扩展的分布式文件系统,为Hadoop集群提供了存储和处理大量数据的能力。
在Hadoop中,用户可以使用各种HDFS常用操作来管理和操作存储在HDFS上的数据。
本文将介绍HDFS中的一些常用操作方法。
1. 上传文件:使用命令`hadoop fs -put <local_file_path><hdfs_path>`将本地文件上传到HDFS。
例如,`hadoop fs -put/home/user/file.txt /user/hadoop/`将本地文件`file.txt`上传到HDFS的`/user/hadoop/`目录下。
3. 创建目录:使用命令`hadoop fs -mkdir <hdfs_path>`在HDFS上创建目录。
例如,`hadoop fs -mkdir /user/hadoop/data`将在HDFS的根目录下创建一个名为`data`的目录。
4. 删除文件或目录:使用命令`hadoop fs -rmr <hdfs_path>`删除HDFS上的文件或目录。
例如,`hadoop fs -rmr/user/hadoop/file.txt`将删除HDFS上的`/user/hadoop/file.txt`文件。
5. 列出目录内容:使用命令`hadoop fs -ls <hdfs_path>`列出指定目录下的文件和子目录。
例如,`hadoop fs -ls /user/hadoop/`将列出`/user/hadoop/`目录下的文件和子目录。
6. 查看文件内容:使用命令`hadoop fs -cat <hdfs_path>`将HDFS上的文件内容输出到控制台。
例如,`hadoop fs -cat/user/hadoop/file.txt`将显示`/user/hadoop/file.txt`文件的内容。
《操作系统》实验二

《操作系统》实验二一、实验目的本实验旨在加深对操作系统基本概念和原理的理解,通过实际操作,提高对操作系统设计和实现的认知。
通过实验二,我们将重点掌握进程管理、线程调度、内存管理和文件系统的基本原理和实现方法。
二、实验内容1、进程管理a.实现进程创建、撤销、阻塞、唤醒等基本操作。
b.设计一个简单的进程调度算法,如轮转法或优先级调度法。
c.实现进程间的通信机制,如共享内存或消息队列。
2、线程调度a.实现线程的创建、撤销和调度。
b.实现一个简单的线程调度算法,如协同多任务(cooperative multitasking)。
3、内存管理a.设计一个简单的分页内存管理系统。
b.实现内存的分配和回收。
c.实现一个简单的内存保护机制。
4、文件系统a.设计一个简单的文件系统,包括文件的创建、读取、写入和删除。
b.实现文件的存储和检索。
c.实现文件的备份和恢复。
三、实验步骤1、进程管理a.首先,设计一个进程类,包含进程的基本属性(如进程ID、状态、优先级等)和操作方法(如创建、撤销、阻塞、唤醒等)。
b.然后,实现一个进程调度器,根据不同的调度算法对进程进行调度。
可以使用模拟的方法,不需要真实的硬件环境。
c.最后,实现进程间的通信机制,可以通过模拟共享内存或消息队列来实现。
2、线程调度a.首先,设计一个线程类,包含线程的基本属性(如线程ID、状态等)和操作方法(如创建、撤销等)。
b.然后,实现一个线程调度器,根据不同的调度算法对线程进行调度。
同样可以使用模拟的方法。
3、内存管理a.首先,设计一个内存页框类,包含页框的基本属性(如页框号、状态等)和操作方法(如分配、回收等)。
b.然后,实现一个内存管理器,根据不同的内存保护机制对内存进行保护。
可以使用模拟的方法。
4、文件系统a.首先,设计一个文件类,包含文件的基本属性(如文件名、大小等)和操作方法(如创建、读取、写入、删除等)。
b.然后,实现一个文件系统管理器,包括文件的存储和检索功能。
实验四

实验四文件系统一、目的要求1、用高级语言编写和调试一个简单的文件系统。
模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
2、要求设计一个n个用户的文件系统。
每次用户可保存m个件,用户在一次运行中只能打开一个文件。
对文件必须设置保护措施,且至少有Creat,Delete,Close,Write等命令。
二、实验设计:设计一个10个用户的文件系统。
每个用户最多可保存10个文件,一次运行用户可一个文件。
程序是采用二级文件目录。
(即设置主目录(MFD)和用户文件目录(UFD)。
另外,为打开文件设置指针。
为了方便实现,对文件的读写作了简化。
在执行读写命令时,只需改读写指针。
并不进行实际的读写操作。
四、实验流程:实验开始,先进入MFD表,初值为空。
输入用户名字,需要保存用户名字,同时也有了有个新文件目录表。
接着是文件的一系列的基本操作:1、打印所有文件名。
2、打开一个文件。
3、添加一个文件。
4、删除一个文件。
5、改文件的保护码。
6、写文件。
7、读文件。
8、退出。
可以,重复用户登陆。
框图如下:五、源程序:#include <iostream.h>#include <string.h>#include <stdio.h>#include<iomanip.h>struct user {char name[10];}user[10];int in=0;struct link {struct file {char name[10];int lenght;int write;int read;int exe;}file[10];int used;}link[10];char name[10];int p;int checkuser();void createuser();void openall();void openfile();void createfile();void deletefile();void changeprotect();void write();void read();int find();void main(){int ch;char c;cout<<"*******************文件管理统*********************"<<endl<<endl<<endl; str: cout<<"用户名:";cin>>name;p=checkuser();if(p==10) {cout<<"用户不存在!"<<endl;cout<<"是否加为用户(y/n):";cin>>c;if(c=='y')createuser();else goto str;}printf("请输入操作:\n");menu: printf("1.打开所有文件.\n2.打开某一文件.\n3.添加文件.\n4.删除文件.\n5.改文件保护位.\n6.写文件.\n7.读文件.\n8.退出.\nchoose1,2,3,4,5,6,7,8:");cin>>ch;if(ch==1)openall();if(ch==2)openfile();if(ch==3)createfile();if(ch==4)deletefile();if(ch==5)changeprotect();if(ch==6)write();if(ch==7)read();if(ch==8) {printf("是否退出程序(y/n):");cin>>c;if(c=='y') goto ext;goto str;}goto menu;ext:cout<<"拜拜"<<endl;}int checkuser(){int s;for(int i=0;i<10;i++){s=strcmp(name,user[i].name);if(s==0) return i;}return 10;}void createuser(){strcpy(user[in].name,name);link[in].used=0;in++;}void openall(){if(link[p].used==0)cout<<"此文件夹为空!"<<endl;else{cout<<"文件名------读保护------写保护------执保护"<<endl;for(int i=0;i<link[p].used;i++)cout<<link[p].file[i].name<<setw(12)<<link[p].file[i].write<<setw(12)<<link[p].file[i].read< <setw(12)<<link[p].file[i].exe<<endl;}}void openfile(){cout<<"输入文件名:";cin>>name;int i=find();if(i==10)cout<<"此文件不存在!"<<endl;else{cout<<"文件名------读保护------写保护------执保护------文件长度"<<endl;cout<<link[p].file[i].name<<setw(12)<<link[p].file[i].write<<setw(12)<<link[p].file[i].read< <setw(12)<<link[p].file[i].exe<<setw(12)<<link[p].file[i].lenght<<endl;}}void createfile(){int a=link[p].used;link[p].used++;cout<<"输入文件名:";cin>>link[p].file[a].name;link[p].file[a].write=0;link[p].file[a].read=0;link[p].file[a].exe=0;link[p].file[a].lenght=0;}void deletefile(){cout<<"输入文件名:";cin>>name;int i=find();if(i==10)cout<<"此文件不存在!";else {for(int j=i;j<9;j++){strcpy(link[p].file[i].name,link[p].file[i+1].name);link[p].file[i].write=link[p].file[i+1].write;link[p].file[i].read=link[p].file[i+1].read;link[p].file[i].exe=link[p].file[i+1].exe;}link[p].used--;}}void changeprotect(){cout<<"输入文件名:"<<endl;cin>>name;int i=find();if(i==10)cout<<"此文件不存在!";else {cout<<"改变保护值:读,写,执:(0/1,0/1,0/1):";cin>>link[p].file[i].write;cin>>link[p].file[i].read;cin>>link[p].file[i].exe;}}void write(){cout<<"输入文件名:"<<endl;cin>>name;int l;int i=find();if(i==10)cout<<"此文件不存在!";else {cout<<"此文件已经打开!";cout<<"文件将要写的长度:";cin>>l;link[p].file[i].lenght+=l;}}void read(){cout<<"输入文件名:"<<endl;cin>>name;int i=find();if(i==10)cout<<"此文件不存在!"<<endl;else {cout<<"文件已经打开!"<<endl;cout<<"文件长度为:"<<link[p].file[i].lenght<<endl;}}int find(){int a;for(int i=0;i<10;i++){a=strcmp(name,link[p].file[i].name);if(a==0) return i;}return 10;}。
linux操作系统实验题目

[解答]mv large memos
10.显示一个文件的后五行
[解答]tail –n 5 large
11.显示一个文件的前五行
[解答]head –n 5 large
12.把一个文件的最后30个字符存到另一个文件中
[解答]tail –c 30 large>>myfile
b、这只是gcc最最基本的用法。
2.调试下面c语言程序,并在实验报告中说明该程序的功能。
#i nclude <stdio.h>
main() {
int n,a[200],carry,temp,i,j,digit = 1;
printf("Please input n:");
scanf("%d",&n);
1用linux启动光盘启动计算机2选择安装语言鼠标键盘等3选择安装类型服务器工作站自定升级4为磁盘划分linux分区与swap分区5选择引导装载程序与记录引导程序的位置6依次配置网络防火墙语言及时区7配置帐号与密码8选择合适的软件包9进行图形界面配置10安装软件包11创建引导盘12进行x窗口设置13安装完成
⑴用静态数组或二维数组形式定义命令保留字表和shell命令字表。静态数组形式如下:static char * cst [ ]="dir"…"end";static char * scwt [ ]="ls —l"…"exit";
⑵输入命令字gets(string);
⑶分离命令字strcspn();strncpy()
} }
printf("Result is:\n%d ! = ",n);
北京邮电大学操作系统综合课程设计

北京邮电大学课程设计报告目录实验一 Linux启动优化............................................................... 错误!未指定书签。
一实验目的........................................................................... 错误!未指定书签。
二实验内容与步骤............................................................... 错误!未指定书签。
1内核态启动优化........................................................... 错误!未指定书签。
2 用户态启动优化.......................................................... 错误!未指定书签。
3 测试系统总的启动时间.............................................. 错误!未指定书签。
三实验原理........................................................................... 错误!未指定书签。
四实验结果及分析............................................................... 错误!未指定书签。
1 内核态启动优化.......................................................... 错误!未指定书签。
2开机画面....................................................................... 错误!未指定书签。
操作系统实验报告4

操作系统实验报告4一、实验目的本次操作系统实验的目的在于深入了解和掌握操作系统中进程管理、内存管理、文件系统等核心概念和相关操作,通过实际的实验操作,增强对操作系统原理的理解和应用能力,提高解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C++,开发工具为 Visual Studio 2019。
三、实验内容与步骤(一)进程管理实验1、进程创建与终止使用 C++语言编写程序,创建多个进程,并在进程中执行不同的任务。
通过进程的标识符(PID)来监控进程的创建和终止过程。
2、进程同步与互斥设计一个生产者消费者问题的程序,使用信号量来实现进程之间的同步与互斥。
观察生产者和消费者进程在不同情况下的执行顺序和结果。
(二)内存管理实验1、内存分配与释放编写程序,使用动态内存分配函数(如`malloc` 和`free`)来分配和释放内存。
观察内存的使用情况和内存泄漏的检测。
2、内存页面置换算法实现几种常见的内存页面置换算法,如先进先出(FIFO)算法、最近最少使用(LRU)算法和最佳置换(OPT)算法。
通过模拟不同的页面访问序列,比较不同算法的性能。
(三)文件系统实验1、文件创建与读写使用 C++语言的文件操作函数,创建一个新文件,并向文件中写入数据。
从文件中读取数据,并进行数据的处理和显示。
2、文件目录操作实现对文件目录的创建、删除、遍历等操作。
观察文件目录结构的变化和文件的组织方式。
四、实验结果与分析(一)进程管理实验结果与分析1、进程创建与终止在实验中,成功创建了多个进程,并通过控制台输出观察到了每个进程的 PID 和执行状态。
可以看到,进程的创建和终止是按照程序的逻辑顺序进行的,操作系统能够有效地管理进程的生命周期。
2、进程同步与互斥在生产者消费者问题的实验中,通过信号量的控制,生产者和消费者进程能够正确地实现同步与互斥。
当缓冲区为空时,消费者进程等待;当缓冲区已满时,生产者进程等待。
实验4 Windows_NTFS文件系统权限实验

实验4 Windows NTFS文件系统权限实验
一、实验内容:学习应用Windows NTFS 文件系统权限的管理和应用
二、实验要求:对Windows NTFS文件系统有所了解,学会对权限的设置
三、实验步骤:
1. 右键单机“我的电脑”,打开“管理”,在本地用户和组的用户里面创建一个新用户:以自己的名字拼音命名,如张三,命名为zhangshan
2.完成新用户的创建之后我们接着在系统盘除外
.....的盘里按照用户的前六项权限创建(完全控制、修改、读取和运行、列出文件夹目录、读取、写入)六个文件夹,对于这个文件夹分别赋予和文件名相同的权限.
3.下面把新创建的六个文件夹的属性打开,把它们的Users
..
.....组全部移
....除掉
然后用再在新建的六个文件夹里面放入一个:批处理文件、一个文件夹和一个带内容的文本,当这些都完成之后开始进行下一步的实验.
下面我们对用zhangshan用户对完全控制做实验,那么我们把六个文件夹全部都加入zhangshan 用户里面.
下一步在zhangshan用户下依次对六个文件夹赋予
..。
..与它们的文件名字相对应的权限
下面注销administrator 用户切换到zhangshan 用户来检测权限的应用。
4.把以上过程截图并形成实验报告。
实验4代码

1、编程管理文件makefilefilsys:main.o igetput.o iallfre.o ballfre.o name.o access.o log.o close.o create.o delete.o dir.o dirlt.o open.o rdwt.o format.o install.o halt.occ -o filsys main.o igetput.o iallfre.o ballfre.o name.o access.o log.o close.o create.o delete.o dir.o dirlt.o open.o rdwt.o format.o install.o halt.omain.o:main.c filesys.hcc -c main.cigetput.o:iallfre.c filesys.hcc -c igetput.ciallfre.o:iallfre.c filesys.hcc -c iallfre.cballfre.o:ballfre.c filesys.hcc -c ballfre.cname.o:name.c filesys.hcc -c name.caccess.o:access.c filesys.hcc -c access.clog.o:log.c filesys.hcc -c log.cclose.o:close.c filesys.hcc -c close.ccreate.o:create.c filesys.hcc -c create.cdelete.o:delete.c filesys.hcc -c delete.cdir.o:dir.c filesys.hcc -c dir.cdirlt.o:dirlt.c filesys.hcc -c dirlt.copen.o:open.c filesys.hcc -c open.crdwt.o:rdwt.c filesys.hcc -c rdwt.cformat.o:format.c filesys.hcc -c format.cinstall.o:install.c filesys.hcc -c install.chalt.o:halt.ccc -c halt.cclean:rm edit main.o igetput.o iallfre.o ballfre.o name.o access.o log.o close.o create.o delete.o dir.o dirlt.o open.o rdwt.o format.o install.o halt.o2、头文件filesys.h#define BLOCKSIZ 512#define SYSOPENFILE 40#define DIRNUM 128#define DIRSIZ 14#define PWDSIZ 12#define PWDNUM 32#define NOFILE 20#define NADDR 10#define NHINO 128#define USERNUM 10#define DINODESIZ 32#define DINODEBLK 32#define FILEBLK 512#define NICFREE 50#define NICINOD 50#define DINODESTART 2*BLOCKSIZ#define DATASTART (2+DINODEBLK)*BLOCKSIZ#define DIEMPTY 0000#define DIFILE 01000#define DIDIR 02000#define UDIREAD 00001#define UDIWRITE 00002#define UDIEXICUTE 00004#define GDIREAD 00010#define GDIWRITE 00020#define GDIEXICUTE 00040#define ODIREAD 00100#define ODIWRITE 00200#define ODIEXICUTE 00400#define READ 1#define WRITE 2#define EXICUTE 4#define DEFAULTMODE 00777#define IUPDATE 00002#define SUPDATE 00001#define FREAD 00001#define FWRITE 00002#define FAPPEND 00004#define DISKFULL 65535#define SEEK_SET 0struct inode{struct inode *i_forw;struct inode *i_back;char i_flag;unsigned int i_ino;unsigned int i_count;unsigned short di_number;unsigned short di_mode;unsigned short di_uid;unsigned short di_gid;unsigned int di_size;unsigned int di_addr[NADDR]; };struct dinode{unsigned short di_number; unsigned short di_mode;unsigned short di_uid;unsigned short di_gid;unsigned long di_size;unsigned int di_addr[NADDR]; };struct direct{char d_name[DIRSIZ];unsigned int d_ino;};struct filsys{unsigned short s_isize;unsigned long s_fsize;unsigned int s_nfree;unsigned short s_pfree;unsigned int s_free[NICFREE]; unsigned s_ninode;unsigned short s_pinode;unsigned int s_inode[NICINOD]; unsigned int s_rinode;char s_fmod;};struct pwd{unsigned short p_uid;unsigned short p_gid;char password[PWDSIZ];};struct dir{struct direct direct[DIRNUM];int size;};struct hinode{struct inode *i_forw;};struct file{char f_flag;unsigned int f_count;struct inode *f_inode;unsigned long f_off;};struct user{unsigned short u_default_mode;unsigned short u_uid;unsigned short u_gid;unsigned short u_ofile[NOFILE];};extern struct hinode hinode[NHINO];extern struct dir dir;extern struct file sys_ofile[SYSOPENFILE]; extern struct filsys filsys;extern struct pwd pwd[PWDNUM];extern struct user user[USERNUM];extern FILE *fd;extern struct inode *cur_pah_inode; extern user_id,file_block;extern struct inode *iget();extern iput();extern unsigned int balloc();extern bfree();extern struct inode *ialloc();extern ifree();extern unsigned int namei();extern unsigned int iname();extern unsigned int access();extern _dir();extern mkdir();extern chdir();extern dirlt();extern unsigned short open();extern create();extern unsigned int read();extern unsigned write();extern int login();extern logout();extern install();extern format();extern close();extern halt();3、主程序main()#include"string.h"#include"stdio.h"#include"filesys.h"#include"stddef.h"#include"stdlib.h"struct hinode hinode[NHINO];struct dir dir;struct file sys_ofile[SYSOPENFILE];struct filsys filsys;struct pwd pwd[PWDNUM];struct user user[USERNUM];FILE *fd;struct inode *cur_path_inode;int user_id,file_block;main(){unsigned short ab_fd1,ab_fd2,ab_fd3,ab_fd4;unsigned short bhy_fd1;char *buf;printf("\nDo you want to format the disk\n");if (getchar()=='y'){ printf("Format will erase all context on the disk.Are you sure? \n");getchar();}elsereturn;if(getchar()=='y')format();elsereturn;install();_dir();login(2118,"abcd");user_id=0;mkdir("a2118");chdir("a2118");ab_fd1=create(user_id,"file0.c",01777); file_block=BLOCKSIZ*6+5;buf=(char *)malloc(BLOCKSIZ*6+5);write(ab_fd1,buf,BLOCKSIZ*6+5);close(user_id,ab_fd1);free(buf);mkdir("subdir");chdir("subdir");ab_fd2=create(user_id,"file1.c",01777); file_block=BLOCKSIZ*4+20;buf=(char *)malloc(BLOCKSIZ*4+20);write(ab_fd2,buf,BLOCKSIZ*4+20);close(user_id,ab_fd2);free(buf);chdir("..");ab_fd3=create(user_id,"file2.c",01777); file_block=BLOCKSIZ*3+255;buf=(char *)malloc(BLOCKSIZ*3+255);write(ab_fd3,buf,BLOCKSIZ*3+255);close(user_id,ab_fd3);free(buf);_dir();delete("ab_file0.c");ab_fd4=create(user_id,"file3.c",01777); file_block=BLOCKSIZ*8+300;buf=(char *)malloc(BLOCKSIZ*8+300);write(ab_fd4,buf,BLOCKSIZ*8+300);close(user_id,ab_fd4);free(buf);_dir();ab_fd3=open(user_id,"file2.c",FAPPEND);file_block=BLOCKSIZ*3+100;buf=(char *)malloc(BLOCKSIZ*3+100);write(ab_fd3,buf,BLOCKSIZ*3+100);close(user_id,ab_fd3);free(buf);_dir();chdir("..");logout();halt();}4、初始化磁盘格式程序format()#include"stdlib.h"#include"stdio.h"#include"stddef.h"#include"string.h"#include"filesys.h"format(){struct inode *inode;struct direct dir_buf[BLOCKSIZ/(DIRSIZ+2)];struct filsys;unsigned int block_buf[BLOCKSIZ/sizeof(int)];char *buf;int i,j;fd=fopen("filesystem","r+w+b");buf=(char *)malloc((DINODEBLK+FILEBLK+2)*BLOCKSIZ*sizeof(char)); if(buf==NULL){printf("\nfile system file creat failed!\n");exit(0);}fseek(fd,0,SEEK_SET);fwrite(buf,1,(DINODEBLK+FILEBLK+2)*BLOCKSIZ*sizeof(char),fd);pwd[0].p_uid=2116;pwd[0].p_gid=03;strcpy(pwd[0].password,"dddd");pwd[1].p_uid=2117;pwd[1].p_gid=03;strcpy(pwd[1].password,"bbbb");pwd[2].p_uid=2118;pwd[2].p_gid=04;strcpy(pwd[2].password,"abcd");pwd[3].p_uid=2119;pwd[3].p_gid=04;strcpy(pwd[3].password,"cccc");pwd[4].p_uid=2220;pwd[4].p_gid=05;strcpy(pwd[4].password,"eeee");inode=iget(0);inode->di_mode=DIEMPTY;iput(inode);inode=iget(1);inode->di_number=1;inode->di_mode=DEFAULTMODE|DIDIR;inode->di_size=3*(DIRSIZ+2);inode->di_addr[0]=0;strcpy(dir_buf[0].d_name,"..");dir_buf[0].d_ino=1;strcpy(dir_buf[1].d_name,".");dir_buf[1].d_ino=1;strcpy(dir_buf[2].d_name,"etc");dir_buf[2].d_ino=2;fseek(fd,DATASTART,SEEK_SET);fwrite(dir_buf,1,3*(DIRSIZ+2),fd);iput(inode);inode=iget(2);inode->di_number=1;inode->di_mode=DEFAULTMODE|DIDIR;inode->di_size=3*(DIRSIZ+2);inode->di_addr[0]=1;strcpy(dir_buf[0].d_name,"..");dir_buf[0].d_ino=1;strcpy(dir_buf[1].d_name,".");dir_buf[1].d_ino=2;strcpy(dir_buf[2].d_name,"password");dir_buf[2].d_ino=3;fseek(fd,DATASTART+BLOCKSIZ*1,SEEK_SET); fwrite(dir_buf,1,3*(DIRSIZ+2),fd);iput(inode);inode=iget(3);inode->di_number=1;inode->di_mode=DEFAULTMODE|DIDIR;inode->di_size=BLOCKSIZ;inode->di_addr[0]=2;for(i=5;i<PWDNUM;i++){ pwd[i].p_uid=0;pwd[i].p_gid=0;strcpy(pwd[i].password," ");}fseek(fd,DATASTART+BLOCKSIZ*2,SEEK_SET);fwrite(pwd,1,BLOCKSIZ,fd);iput(inode);filsys.s_isize=DINODEBLK;filsys.s_isize=FILEBLK;filsys.s_ninode=DINODEBLK*BLOCKSIZ/DINODESIZ-4;filsys.s_nfree=FILEBLK-3;for(i=0;i<NICINOD;i++){filsys.s_inode[i]=4+i;}filsys.s_pinode=0;filsys.s_rinode=NICINOD+4;block_buf[NICFREE-1]=FILEBLK+1;for(i=0;i<NICFREE-1;i++)block_buf[NICFREE-2-i]=FILEBLK-i;fseek(fd,DATASTART+BLOCKSIZ*(FILEBLK-NICFREE-1),SEEK_SET); fwrite(block_buf,1,BLOCKSIZ,fd);for(i=FILEBLK-NICFREE-1;i>2;i-=NICFREE){for(j=0;j<NICFREE;j++){block_buf[j]=i-j;}block_buf[j]=50;fseek(fd,DATASTART+BLOCKSIZ*(i-1),SEEK_SET);fwrite(block_buf,1,BLOCKSIZ,fd);}j=i+NICFREE;for(i=j;i>2;i--){filsys.s_free[NICFREE-1+i-j]=i;}filsys.s_pfree=NICFREE-1-j+3;filsys.s_pinode=0;fseek(fd,BLOCKSIZ,SEEK_SET);fwrite(&filsys,1,sizeof(filsys),fd);fseek(fd,BLOCKSIZ,SEEK_SET);fread(&filsys.s_isize,1,sizeof(filsys),fd); }5、进入文件系统程序install()#include<stdio.h>#include<string.h>#include"filesys.h"install(){int i,j;struct inode *cur_path_inode;fseek(fd,BLOCKSIZ,SEEK_SET);fread(&filsys,1,sizeof(struct filsys),fd); for(i=0;i<NHINO;i++){hinode[i].i_forw=NULL;}for(i=0;i<SYSOPENFILE;i++){sys_ofile[i].f_count=0;sys_ofile[i].f_inode=NULL;}for(i=0;i<USERNUM;i++){user[i].u_uid=0;user[i].u_gid=0;for(j=0;j<NOFILE;j++)user[i].u_ofile[j]=SYSOPENFILE+1;}cur_path_inode=iget(1);dir.size=cur_path_inode->di_size/(DIRSIZ+2); for(i=0;i<DIRNUM;i++){strcpy(dir.direct[i].d_name," ");dir.direct[i].d_ino=0;}for(i=0;i<dir.size/(BLOCKSIZ/(DIRSIZ+2));i++){fseek(fd,DATASTART+BLOCKSIZ*cur_path_inode->di_addr[i],SEEK_SET);fread(&dir.direct[(BLOCKSIZ/(DIRSIZ+2))*i],1,BLOCKSIZ,fd);}fseek(fd,DATASTART+BLOCKSIZ*cur_path_inode->di_addr[i],SEEK_SET);fread(&dir.direct[(BLOCKSIZ)/(DIRSIZ+2)*i],1,cur_path_inode->di_size%BLOCKSIZ,fd );}6、退出程序halt()#include"stdio.h"#include"stdlib.h"#include"filesys.h"halt(){ struct inode *inode;struct inode *cur_path_inode;int i,j;chdir("..");iput(cur_path_inode);for(i=0;i<USERNUM;i++){if(user[i].u_uid!=0){for(j=0;j<NOFILE;j++){if(user[i].u_ofile[j]!=SYSOPENFILE+1){close(i,j);user[i].u_ofile[j]!=SYSOPENFILE+1;}}}}fseek(fd,BLOCKSIZ,SEEK_SET);fwrite(&filsys,1,sizeof(struct filsys),fd);fclose(fd);printf("\nGood bye. See you Next Time.Please turn off the switch.\n");exit(0);}7、获取释放i节点内容程序iget()/iput()#include"stdio.h"#include"filesys.h"#include"stdlib.h"struct inode *iget(dinodeid)unsigned int dinodeid;{ int existed=0,inodeid;long addr;struct inode *temp,*newinode;inodeid=dinodeid%NHINO;if(hinode[inodeid].i_forw==NULL)existed=0;else{ temp=hinode[inodeid].i_forw;while(temp){ if(temp->i_ino==inodeid){ existed=1;temp->i_count++;return temp;}elsetemp=temp->i_forw;}}addr=DINODESTART+dinodeid*DINODESIZ;newinode=(struct inode*)malloc(sizeof(struct inode)); fseek(fd,addr,SEEK_SET);fread(&(newinode->di_number),DINODESIZ,1,fd);newinode->i_forw=hinode[inodeid].i_forw;newinode->i_back=newinode;if(newinode->i_forw!=NULL)newinode->i_forw->i_back=newinode;/* hinode[inodeid].i_forw->i_back=newinode;*/hinode[inodeid].i_forw=newinode;newinode->i_count=1;newinode->i_flag=0;newinode->i_ino=dinodeid;newinode->di_size=3*(DIRSIZ+2);if(dinodeid==3)newinode->di_size=BLOCKSIZ;return newinode;}iput(pinode)struct inode *pinode;{ long addr;unsigned int block_num;int i;if(pinode->i_count>1){ pinode->i_count--;return;}else{ if(pinode->di_number!=0){ addr=DINODESTART+pinode->i_ino*DINODESIZ;fseek(fd,addr,SEEK_SET);fwrite(&pinode->di_number,DINODESIZ,1,fd);}else{ block_num=pinode->di_size/BLOCKSIZ;for(i=0;i<block_num;i++)bfree(pinode->di_addr[i]);ifree(pinode->i_ino);}if(pinode->i_forw==NULL)pinode->i_back->i_forw=NULL;else{ pinode->i_forw->i_back=pinode->i_back;pinode->i_back->i_forw=pinode->i_forw;}ifree(pinode);}}8、i节点分配和释放函数ialloc()和ifree()#include"stdio.h"#include"filesys.h"static struct dinode block_buf[BLOCKSIZ/DINODESIZ];struct inode *ialloc(){struct inode *temp_inode;unsigned int cur_di;int i,count,block_end_flag;if(filsys.s_pinode==NICINOD) /*s_inode empty*/ {i=0;count=0;block_end_flag=1;filsys.s_pinode=NICINOD-1;cur_di=filsys.s_rinode;while((count<NICINOD)||(count<=filsys.s_ninode)){if(block_end_flag){fseek(fd,DINODESTART+cur_di*DINODESIZ,SEEK_SET);fread(block_buf,1,BLOCKSIZ,fd);block_end_flag=0;i=0;}while(block_buf[i].di_mode==DIEMPTY){cur_di++;i++;}if(i==NICINOD)block_end_flag=1;else{filsys.s_inode[filsys.s_pinode--]=cur_di;count++;}}filsys.s_rinode=cur_di;}temp_inode=iget(filsys.s_inode[filsys.s_pinode]);fseek(fd,DINODESTART+filsys.s_inode[filsys.s_pinode]*DINODESIZ,SEEK_SET); fwrite(&temp_inode->di_number,1,sizeof(struct dinode),fd);filsys.s_pinode++;filsys.s_ninode--;filsys.s_fmod=SUPDATE;return temp_inode;}ifree(dinodeid) /*ifree*/unsigned dinodeid;{filsys.s_ninode++;if(filsys.s_pinode!=NICINOD) /*not full*/{filsys.s_inode[filsys.s_pinode]=dinodeid;filsys.s_pinode++;}else /*full*/{if(dinodeid<filsys.s_rinode){filsys.s_inode[NICINOD]=dinodeid;filsys.s_rinode=dinodeid;}}}9、磁盘块分配与释放函数balloc()与bfree()#include"stdio.h"#include"filesys.h"static unsigned int block_buf[BLOCKSIZ];unsigned int balloc(){unsigned int free_block,free_block_num;int i;if(filsys.s_nfree==0){printf("\nDisk Full!\n");return DISKFULL;}free_block=filsys.s_free[filsys.s_pfree];if(filsys.s_pfree==NICFREE-1){fseek(fd,DATASTART+(562-filsys.s_nfree)*BLOCKSIZ,SEEK_SET);fread(block_buf,1,BLOCKSIZ,fd);free_block_num=block_buf[NICFREE]; /*the total number in the group*/for(i=0;i<free_block_num;i++){filsys.s_free[NICFREE-1-i]=block_buf[i];}filsys.s_pfree=NICFREE-free_block_num;}elsefilsys.s_pfree++;filsys.s_nfree--;filsys.s_fmod=SUPDATE;return free_block;}bfree(block_num)unsigned int block_num;{int i;if(filsys.s_free==0){block_buf[NICFREE]=NICFREE;for(i=0;i<NICFREE;i++){block_buf[i]=filsys.s_free[NICFREE-1-i];}filsys.s_pfree=NICFREE-1;}fseek(fd,BLOCKSIZ,SEEK_SET);fwrite(block_buf,1,BLOCKSIZ,fd);filsys.s_nfree++;filsys.s_fmod=SUPDATE;}10、搜索函数namei()和iname()#include"string.h"#include"stdio.h"#include"filesys.h"unsigned int namei(name) /*namei*/char *name;{int i,notfound=1;for(i=0;((i<dir.size)&&(notfound));i++)if((!strcmp(dir.direct[i].d_name,name))&&(dir.direct[i].d_ino!=0)) return dir.direct[i].d_ino; /*find*/return 0; /*not find*/}unsigned int iname(name) /*iname*/char *name;{int i,notfound=1;for(i=0;((i<DIRNUM)&&(notfound));i++)if(dir.direct[i].d_ino==0){notfound=0;break;}if(notfound){printf("\n The current directory is full! \n");return 0;}else{strcpy(dir.direct[i].d_name,name);dir.direct[i].d_ino=1;return i;}}11、访问控制函数access()#include "stdio.h"#include "filesys.h"unsigned int access(user_id,inode,mode)unsigned int user_id;struct inode *inode;unsigned short mode;{switch (mode){case READ:if(inode->di_mode & ODIREAD) return 1;if((inode->di_mode & GDIREAD)&&(user[user_id].u_gid==inode->di_gid)) return 1;if((inode->di_mode & UDIREAD)&&(user[user_id].u_uid==inode->di_uid)) return 1;return 0;case WRITE:if(inode->di_mode & ODIWRITE) return 1;if((inode->di_mode & GDIWRITE)&&(user[user_id].u_gid==inode->di_gid)) return 1;if((inode->di_mode& UDIWRITE)&&(user[user_id].u_uid==inode->di_uid)) return 1;return 0;case EXICUTE:if(inode->di_mode & ODIEXICUTE) return 1;if((inode->di_mode & GDIEXICUTE)&&(user[user_id].u_gid==inode->di_gid)) return 1;if((inode->di_mode & UDIEXICUTE)&&(user[user_id].u_uid==inode->di_uid)) return 1;return 0;case DEFAULTMODE:return 1;default:return 0;}}12、显示列表函数_dir()和目录创建函数mkdir()等#include"stdio.h"#include"string.h"#include"filesys.h"_dir(){unsigned short di_mode;int i,j,k,one;struct inode *temp_inode;printf("\nCURRENT DIRECTORY:dir.size=%d\n",dir.size);for(i=0;i<dir.size;i++){if(dir.direct[i].d_ino!=DIEMPTY){ printf("%20s",dir.direct[i].d_name);temp_inode=iget(dir.direct[i].d_ino);di_mode=temp_inode->di_mode;if(temp_inode->di_mode & DIFILE)printf("f");elseprintf("d");for(j=0;j<9;j++){ one=di_mode%2;di_mode=di_mode/2;if(one)printf("x");elseprintf("-");}if(temp_inode->di_mode & DIFILE){printf("%d",temp_inode->di_size);printf("block chain:");for(k=0;k<temp_inode->di_size/BLOCKSIZ+1;k++)printf("%d",temp_inode->di_addr[k]);printf("\n");}elseprintf("<dir>block chain:%d\n",dir.direct[i].d_ino);iput(temp_inode);}}}mkdir(dirname)char *dirname;{int dirid,dirpos;struct inode *inode;struct inode *cur_path_inode;struct direct buf[BLOCKSIZ/(DIRSIZ+2)];unsigned int block;dirid=namei(dirname);if(dirid!=0){inode=iget(dirid);if(inode->di_mode & DIDIR)printf("\n%s directory already existed!\n",dirname);elseprintf("\n%s is a file name,&can't creat a dir the same name\n",dirname); iput(inode);return;}dirpos=iname(dirname);inode=ialloc();dirid=inode->i_ino;dir.direct[dirpos].d_ino=inode->i_ino;dir.size++;strcpy(buf[0].d_name,".");buf[0].d_ino=dirid;strcpy(buf[1].d_name,"..");buf[1].d_ino=cur_path_inode->i_ino;buf[2].d_ino=0;block=balloc();fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);fwrite(buf,1,BLOCKSIZ,fd);inode->di_size=2*(DIRSIZ+2);inode->di_number=1;inode->di_mode=user[user_id].u_default_mode|DIDIR;inode->di_uid=user[user_id].u_uid;inode->di_gid=user[user_id].u_gid;inode->di_addr[0]=block;iput(inode);return;}chdir(dirname)char *dirname;{unsigned int dirid;struct inode *inode;struct inode *cur_path_inode; /*hafkhhfahfh*/ unsigned short block;int i,j,low=0,high=0;dirid=namei(dirname);if(dirid==0){ printf("\n%s does not exist!\n",dirname);return;}inode=iget(dirid);if(!access(user_id,inode,user[user_id].u_default_mode)){ printf("\nhas not access to the directory %s\n",dirname); iput(inode);return;}for(i=0;i<dir.size;i++){for(j=0;j<DIRNUM;j++)if(dir.direct[j].d_ino==0)break;memcpy(&dir.direct[j],&dir.direct[i],DIRSIZ+2);dir.direct[j].d_ino=0;}for(i=0;i<cur_path_inode->di_size/BLOCKSIZ+1;i++){bfree(cur_path_inode->di_addr[i]);}for(i=0;i<dir.size;i+=BLOCKSIZ/(DIRSIZ+2)){block=balloc();cur_path_inode->di_addr[i]=block;fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);fwrite(&dir.direct[0],1,BLOCKSIZ,fd);}cur_path_inode->di_size=dir.size*(DIRSIZ+2);iput(cur_path_inode);cur_path_inode=inode;dir.size=inode->di_size/(DIRSIZ+2);j=0;for(i=0;i<inode->di_size/BLOCKSIZ+1;i++){fseek(fd,DATASTART+inode->di_addr[i]*BLOCKSIZ,SEEK_SET); fread(&dir.direct[0],1,BLOCKSIZ,fd);j+=BLOCKSIZ/(DIRSIZ+2);}return;}13、文件创建函数create(()#include"stdio.h"#include"filesys.h"create(user_id,filename,mode)unsigned int user_id;char *filename;unsigned short mode;{unsigned int di_ino,di_ith;struct inode *inode;int i,j;di_ino=namei(filename);if(di_ino!=0){ inode=iget(di_ino);if(access(user_id,inode,mode)==0){ iput(inode);printf("\ncreate access not allowed");return;}for(i=0;i<inode->di_size/BLOCKSIZ+1;i++){bfree(inode->di_addr[i]);}for(i=0;i<SYSOPENFILE;i++)if(sys_ofile[i].f_inode==inode)sys_ofile[i].f_off=0;for(i=0;i<NOFILE;i++)if(user[user_id].u_ofile[i]==SYSOPENFILE+1){user[user_id].u_uid=inode->di_uid;user[user_id].u_gid=inode->di_gid;for(j=0;j<SYSOPENFILE;j++)if(sys_ofile[j].f_count==0){ user[user_id].u_ofile[i]=j;sys_ofile[j].f_flag=mode;}return i;}}else{inode=ialloc();di_ith=iname(filename);dir.size++;dir.direct[di_ith].d_ino=inode->i_ino;dir.direct[di_ith+1].d_ino=0;inode->di_mode=user[user_id].u_default_mode|DIFILE; inode->di_uid=user[user_id].u_uid;inode->di_gid=user[user_id].u_gid;inode->di_size=file_block;inode->di_number=1;for(i=0;i<SYSOPENFILE;i++)if(sys_ofile[i].f_count==0)break;for(j=0;j<NOFILE;j++)if(user[user_id].u_ofile[j]==SYSOPENFILE+1)break;user[user_id].u_ofile[j]=i;sys_ofile[i].f_flag=mode;sys_ofile[i].f_count=0;sys_ofile[i].f_off=0;sys_ofile[i].f_inode=inode;return j;}}14、打开文件函数open()#include"stdio.h"#include"filesys.h"unsigned short open(user_id,filename,openmode)int user_id;char *filename;unsigned short openmode;{unsigned int dinodeid;struct inode *inode;int i,j;dinodeid=namei(filename);if(dinodeid==0){printf("\nfile does not exist!\n");return 0;}inode=iget(dinodeid);if(!access(user_id,inode,openmode)){printf("\nfile open has not access!\n");iput(inode);return 0;}for(i=0;i<SYSOPENFILE;i++)if(sys_ofile[i].f_count==0) break;if(i==SYSOPENFILE){ printf("\nsystem open file too much\n");iput(inode);return 0;}sys_ofile[i].f_inode=inode;sys_ofile[i].f_flag=openmode;sys_ofile[i].f_count=1;if(openmode&FAPPEND)sys_ofile[i].f_off=inode->di_size;elsesys_ofile[i].f_off=0;for(j=0;j<NOFILE;j++)if(user[user_id].u_ofile[j]==SYSOPENFILE+1) break;if(j==NOFILE){printf("\nuser open file too much!\n");sys_ofile[i].f_count=0;iput(inode);return 0;}user[user_id].u_ofile[j]=1;if(!(openmode&FAPPEND)){for(i=0;i<inode->di_size/BLOCKSIZ+1;i++)bfree(inode->di_addr[i]);inode->di_size=0;}return j;}15、关闭文件系统函数close()#include"stdio.h"#include"filesys.h"close(user_id,cfd)unsigned int user_id;unsigned short cfd;{ struct inode *inode;inode=sys_ofile[user[user_id].u_ofile[cfd]].f_inode; iput(inode);sys_ofile[user[user_id].u_ofile[cfd]].f_count--;user[user_id].u_ofile[cfd]=SYSOPENFILE+1;}16、删除文件函数delete()#include"stdio.h"#include"string.h"#include"filesys.h"delete(filename)char *filename;{ unsigned int dinodeid,i;struct inode *inode;dinodeid=namei(filename);if(dinodeid!=0)inode=iget(dinodeid);inode->di_number--;for(i=0;i<dir.size;i++)if(dir.direct[i].d_ino==dinodeid)break;i++;while(dir.direct[i].d_ino!=0){ strcpy(dir.direct[i-1].d_name,dir.direct[i].d_name);dir.direct[i-1].d_ino=dir.direct[i].d_ino;i++;}dir.direct[i-1].d_ino=0;dir.size=i-1;iput(inode);printf("\ndir.size=%d\n",dir.size);}17、读写文件函数read()和write()#include"stdio.h"#include"filesys.h"#include"dirent.h"unsigned int read (fd1,buf,size)int fd1;char *buf;unsigned int size;{ unsigned long off;int block,block_off,i,j;struct inode *inode;char *temp_buf;inode=sys_ofile[user[user_id].u_ofile[fd1]].f_inode;if(!(sys_ofile[user[user_id].u_ofile[fd1]].f_flag&FREAD)){ printf("\nthe file is not opened for read\n");return 0;}temp_buf=buf;off=sys_ofile[user[user_id].u_ofile[fd1]].f_off;if((off+size)>inode->di_size)size=inode->di_size-off;block_off=off%BLOCKSIZ;block=off/BLOCKSIZ;if(block_off+size<BLOCKSIZ){ fseek(fd,DATASTART+inode->di_addr[block]*BLOCKSIZ+block_off,SEEK_SET); fread(buf,1,size,fd);return size;}fseek(fd,DATASTART+inode->di_addr[block]*BLOCKSIZ+block_off,SEEK_SET);fread(temp_buf,1,BLOCKSIZ-block_off,fd);temp_buf+=BLOCKSIZ-block_off;j=(inode->di_size-off-block_off)/BLOCKSIZ;for(i=0;i<(size-block_off)/BLOCKSIZ;i++){ fseek(fd,DATASTART+inode->di_addr[j+1]*BLOCKSIZ,SEEK_SET);fread(temp_buf,1,BLOCKSIZ,fd);temp_buf+=BLOCKSIZ;}block_off=(size-block_off)%BLOCKSIZ;block=inode->di_addr[off+size/BLOCKSIZ+1];fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);fread(temp_buf,1,block_off,fd);sys_ofile[user[user_id].u_ofile[fd1]].f_off+=size;return size;}unsigned int write(fd1,buf,size)int fd1;char *buf;unsigned int size;{ unsigned long off;int block,block_off,i,j,k=0;struct inode *inode;char *temp_buf;inode=sys_ofile[user[user_id].u_ofile[fd1]].f_inode;temp_buf=buf;off=sys_ofile[user[user_id].u_ofile[fd1]].f_off;block_off=off%BLOCKSIZ;block=off/BLOCKSIZ;if(block_off+size<BLOCKSIZ){ fseek(fd,DATASTART+inode->di_addr[block]*BLOCKSIZ+block_off,SEEK_SET); fwrite(buf,1,size,fd);printf("Write success!\n");return size;}if(sys_ofile[user[user_id].u_ofile[fd1]].f_flag==FAPPEND){ fseek(fd,DATASTART+inode->di_addr[block]*BLOCKSIZ+block_off,SEEK_SET); fwrite(temp_buf,1,BLOCKSIZ-block_off,fd);temp_buf+=BLOCKSIZ-block_off;k=1;}for(i=0;i<(size-k*(BLOCKSIZ-block_off))/BLOCKSIZ;i++){ inode->di_addr[block+1+i]=balloc();fseek(fd,DATASTART+inode->di_addr[block+k+i]*BLOCKSIZ,SEEK_SET);fwrite(temp_buf,1,BLOCKSIZ,fd);temp_buf+=BLOCKSIZ;}block_off=(size-k*(BLOCKSIZ-block_off))%BLOCKSIZ;block=inode->di_addr[block+k+i]=balloc();。
《C语言综合实验》4文件

返回值:返回被打开文件数据区的起始地址,即指向指 定文件的指针,若打开文件失败则返回NULL FILE *fp; fp=fopen("文件名", "使用文件方式"); 在打开一个文件时,通知编译系统三个信息: ①、需要打开的文件名 ②、使用文件的方式 ③、让哪一个指针变量指向被打开的文件
二、关闭文件函数 fclose 使用完一个文件后应该将它关闭,使文件指针变量不再指 向该文件(此后不能再通过该指针对文件进行读/写操作) fclose的函数原型为:
int fclose(FILE *fp)
返回值:若正常关闭,返回0;若关闭失败,返回非0 fp=fopen("file.c", "r"); fclose(fp);
用"r+"方式打开文件时,该文件应该已经存在; 用"w+"方式时则建立一个新文件,可以先向文件写数据,然 后可以读文件中的数据; 用"a+"方式打开文件时,可以向文件追加数据,也可以从文 件读取数据;
⑤、如果文件打开时出错,如:用"r"方式打开一个并不存在的 文件;写文件时磁盘有写保护;磁盘已满无法建立新文件等, 此时fopen函数将返回空指针NULL,否则返回与指定文件 相对应的文件指针。 常用下面的方法打开文件: if ( (fp=fopen("score.dat", "r"))= =NULL) { printf("Cannot open file!\n"); exit(0); }
Linux实验4-Linux文件系统-目录和文件管理

实验报告课程名称: Linux操作系统实验名称:实验4、Linux文件系统-目录和文件管理学生姓名:班级学号学院(系):指导教师:实验时间:年月日实验成绩:实验四、Linux文件系统-目录和文件管理一、实验要求(1)掌握目录和文件管理的操作命令;(2)掌握文件权限的修改方法。
(3)掌握文件链接的方法。
二、实验内容和实验步骤【操作要求1】查看Linux系统常见的目录。
【操作步骤】输入命令:ls,查看Linux系统常见的目录,截图如下:【操作要求2】显示当前目录下文件类型。
【操作步骤】输入命令:ls –l|more,截图如下:说明:●“-”:表示普通文件●“d”:表示目录文件●“c”:表示字符设备文件●“b”:表示块设备文件●“l”:表示符号链接文件【操作要求3】查看当前目录下所有文件类型【操作步骤】输入命令:file *,截图如下:【操作要求4】先创建两个新目录dir1和dir2,然后将dir2目录移到dir1目录中,最后删除dir2目录。
【操作步骤】(1)以普通用户user登陆字符界面,输入命令:pwd,当前目录为用户的主目录:/home/user。
(2)输入命令:ls –l,查看当前目录中的所有文件。
(3)创建两个目录,输入命令:mkdir dir{1,2}。
(4)输入命令:ls –l,确认两个目录创建成功。
以上4个步骤截图如下:(5)输入命令:mv dir2 dir1,将dir2目录移动到dir1目录。
(6)输入命令:cd dir1,切换dir1目录,再输入:ls命令,查看到dir2目录。
截图如下:(7)删除dir2目录,输入命令:rm –rf dir2。
【操作要求5】查找profile文件。
【操作步骤】(1)切换用户为超级用户,输入命令:su -,并输入密码。
(2)输入命令:find /etc -name profile, 截图如下:(3) 使用exit命令,退出超级用户身份。
【操作要求6】将/etc/profile文件中所有包含“HOSTNAME”的行存入f4文件,并修改f4文件的权限,让所有用户都可以读写。
操作系统实验四

操作系统实验四:文件管理模拟实验目的:本实验的目的是,是通过设计和调试一个简单的文件系统,主要是模拟文件操作命令的执行,来模拟文件的管理,使学生对主要文件操作命令的实质和执行过程有比较深入的了解,掌握他们的基本实施方法。
实验要求:1.设计一个支持n个用户的文件系统,每个用户可拥有多个文件;2.采用二级或二级以上(树型目录)的多级文件目录管理;3.对文件应设置存取控制保护方式,如“只能执行”、“允许读”、“允许写”等;4.系统的外部特性应接近于真实系统,可设置下述文件操作命令:creat 建立文件open 打开文件close 关闭文件delete 撤销文件read 读文件write 写文件copy 复制文件directory 查询目录5.通过键盘使用该文件系统,系统应显示操作命令的执行结果。
实验内容:设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。
另外,为打开文件设置了运行文件目录(AFD)。
4、总体流程:初始化文件目录;输出提示符,等待接受命令,分析键入的命令;对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。
算法的流程图如下:以下程序是用pascal语言写成,在tp4下可运行,我有tp4软件。
同学们有兴趣可到我处拷贝,但最好是不要用tp4, pascal现在用的越来越少了,被C语言取代了,现再去详细去看pascal语言书已无必要,尽管现在很多算法,数据结构等仍用pascal 伪语言描述,包括我们的课本《操作系统》(西安电子出版社汤小丹等)中的伪代码也是用类pascal描述的。
由于伪代码不涉及语言细节,同学们很易看懂这样的伪代码。
同学们很易看懂下面的程序:(主要看懂算法,语言细节有不懂也不要紧)program filesystem;Uses crt;const openf :integer=0;type str=string[6];//字符串类型linku=^datau; //定义指向用户文件目录(结构体)的指针类型datau=record //用户文件目录结构体类型filename : str;pcode :integer;length :integer;addr :integer;next :linku;end;linkm=^datam; //定义指向主文件目录(结构体)的指针类型datam=record //主文件目录结构体类型username :str;link :linku;end;linka=^dataa; //定义指向活动文件目录(结构体)的指针类型 dataa=recordfilename :str;pcode :integer;rpointer :integer;wpointer :integer;addr :integer;next :linka;end;var mfd :array[1..5] of linkm;p1,q1:linkm; p2,q2:linku; afd,p3,q3 :linka;x,y1: str; i,y :integer;f: boolean; code :integer;procedure init;//初始化代码label a;beginclrscr;for i:=1 to 10 do writeln;writeln(' ':25,'WELCOME TO OUR FILE SYSTEM!');writeln; writeln;writeln(' ':27,'Please press space bar !');repeat until readkey=' ';clrscr;a: write('User number?');readln(y1);val(y1,y,code); if code<>0 then goto a;if y>5 thenbeginwriteln('User too many!( <=5 )' ) ; goto a;end;writeln('Begin users login:');for i:=1 to y dobeginwrite('User name', i, '?');readln(x);new(p2);p2^.next:=NIL; p2^.filename:=' ';// p2^.next相当于C语言p2->next,即指针操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验4 文件系统
一、目的与要求
1. 目的
文件系统是操作系统的一个重要组成部分,也是与用户关系极为密切的部分。
学生应独立的用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,掌握它们的实施方法,加深对教材中有关内容的理解。
2. 要求
(1)设计一个n个用户的文件系统,每个用户最多可保存m个文件。
(2)限制用户在一次运行中只能打开一个文件。
(3)系统应能检查输入命令的正确性,出错时要能显示出错原因。
(4)对文件必须设置保护措施,如只能执行,允许读,允许写等。
在每次打开文件时,根据本次打开的要求,再次设置保护级别,即可有二级保护。
(5)对文件的操作至少应有下面几条命令:
create 建立文件
delete 删除文件
open 打开文件
close 关闭文件
read 读文件
write 写文件
(6)本次实验的上机时间为2~4学时。
二、实验内容
1. 题目
(1)本次实验设计一个共有10个用户的文件系统,每个用户最多可保存10个文件,一次运行过程中用户可同时打开5个文件。
(2)程序采用二级文件目录,即设置了主文件目录(MFD)和用户文件目录(UFD)。
前者应包含文件主(即用户)及他们的目录区指针;后者应给出每个文件主占有的文件目录,即文件名、保护码、文件长度以及它们存放的位置等。
另外为打开文件设置了运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。
(3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只修改读写指针,并不进行实际文件的读写操作。
2. 算法与框图
(1)因系统小,文件目录的检索使用了简单的线性搜索,而没有采用Hash等有效算法。
(2)文件保护简单使用了三位保护码,对应于允许读,允许写和允许执行,如下所示:
1 1 1
允许读允许写允许执行
如对应位为0,则不允许。
(3)程序中使用的主要数据结构如下:
①主文件目录(MFD)和用户文件目录(UFD)
MFD UFD
②
(4)程序框图5-1所示:
三、参考书目
[1] 郭浩志主编,计算机软件实践教程,西北电讯工程学院出版社,1995年(第二版)
[2] 庞丽萍,李胜利编,操作系统原理,华中科技大学出版社,2000年(第三版)
[3] 汤子瀛,杨成武编著,计算机操作系统,西北电讯工业大学出版社(第二版)。