上海大学操作系统2实验报告)

合集下载

操作系统实验实验报告

操作系统实验实验报告

操作系统实验实验报告一、实验目的操作系统是计算机系统中最为关键的核心软件,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效、稳定的工作环境。

本次操作系统实验的目的在于通过实际操作和实践,深入理解操作系统的基本原理和核心概念,掌握操作系统的基本功能和操作方法,提高对操作系统的认识和应用能力。

二、实验环境本次实验使用的操作系统为 Windows 10 专业版,开发工具为Visual Studio 2019,编程语言为 C 和 C++。

实验硬件环境为一台配备Intel Core i7 处理器、16GB 内存、512GB SSD 硬盘的个人计算机。

三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新的进程,并在完成任务后终止进程。

在实验中,我们使用了 Windows API 函数 CreateProcess 和 TerminateProcess 来完成进程的创建和终止操作。

通过观察进程的创建和终止过程,深入理解了进程的生命周期和状态转换。

2、进程同步与互斥为了实现进程之间的同步与互斥,我们使用了信号量、互斥量等同步对象。

通过编写多线程程序,模拟了多个进程对共享资源的访问,实现了对共享资源的互斥访问和同步操作。

在实验中,我们深刻体会到了进程同步与互斥的重要性,以及不正确的同步操作可能导致的死锁等问题。

(二)内存管理实验1、内存分配与释放使用 Windows API 函数 VirtualAlloc 和 VirtualFree 进行内存的分配和释放操作。

通过实验,了解了内存分配的不同方式(如堆分配、栈分配等)以及内存释放的时机和方法,掌握了内存管理的基本原理和操作技巧。

2、内存分页与分段通过编程模拟内存的分页和分段管理机制,了解了内存分页和分段的基本原理和实现方法。

在实验中,我们实现了简单的内存分页和分段算法,对内存的地址转换和页面置换等过程有了更深入的理解。

(三)文件系统实验1、文件操作使用 Windows API 函数 CreateFile、ReadFile、WriteFile 等进行文件的创建、读取和写入操作。

操作系统实验二实验报告

操作系统实验二实验报告

操作系统实验二实验报告一、实验目的本次操作系统实验二的主要目的是深入理解和掌握进程管理的相关概念和技术,包括进程的创建、执行、同步和通信。

通过实际编程和实验操作,提高对操作系统原理的认识,培养解决实际问题的能力。

二、实验环境本次实验使用的操作系统为 Windows 10,编程环境为 Visual Studio 2019。

三、实验内容及步骤(一)进程创建实验1、首先,创建一个新的 C++项目。

2、在项目中,使用 Windows API 函数`CreateProcess`来创建一个新的进程。

3、为新进程指定可执行文件的路径、命令行参数、进程属性等。

4、编写代码来等待新进程的结束,并获取其退出代码。

(二)进程同步实验1、设计一个生产者消费者问题的模型。

2、使用信号量来实现生产者和消费者进程之间的同步。

3、生产者进程不断生成数据并放入共享缓冲区,当缓冲区已满时等待。

4、消费者进程从共享缓冲区中取出数据进行处理,当缓冲区为空时等待。

(三)进程通信实验1、选择使用管道来实现进程之间的通信。

2、创建一个匿名管道,父进程和子进程分别读写管道的两端。

3、父进程向管道写入数据,子进程从管道读取数据并进行处理。

四、实验结果及分析(一)进程创建实验结果成功创建了新的进程,并能够获取到其退出代码。

通过观察进程的创建和执行过程,加深了对进程概念的理解。

(二)进程同步实验结果通过使用信号量,生产者和消费者进程能够正确地进行同步,避免了缓冲区的溢出和数据的丢失。

分析结果表明,信号量机制有效地解决了进程之间的资源竞争和协调问题。

(三)进程通信实验结果通过管道实现了父进程和子进程之间的数据通信。

数据能够准确地在进程之间传递,验证了管道通信的有效性。

五、遇到的问题及解决方法(一)在进程创建实验中,遇到了参数设置不正确导致进程创建失败的问题。

通过仔细查阅文档和调试,最终正确设置了参数,成功创建了进程。

(二)在进程同步实验中,出现了信号量使用不当导致死锁的情况。

《操作系统》实验报告

《操作系统》实验报告

《操作系统》实验报告一、实验目的操作系统是计算机系统中最为关键的组成部分之一,本次实验的主要目的是深入理解操作系统的基本原理和功能,通过实际操作和观察,熟悉操作系统的核心概念,包括进程管理、内存管理、文件系统和设备管理等,提高对操作系统的实际应用能力和问题解决能力。

二、实验环境本次实验在以下环境中进行:操作系统:Windows 10开发工具:Visual Studio 2019编程语言:C++三、实验内容1、进程管理实验进程是操作系统中最基本的执行单元。

在这个实验中,我们使用C++编写程序来创建和管理进程。

通过观察进程的创建、执行和结束过程,理解进程的状态转换和资源分配。

首先,我们编写了一个简单的程序,创建了多个子进程,并通过进程标识符(PID)来跟踪它们的运行状态。

然后,使用等待函数来等待子进程的结束,并获取其返回值。

在实验过程中,我们发现进程的创建和销毁需要消耗一定的系统资源,而且进程之间的同步和通信需要谨慎处理,以避免出现死锁和竞争条件等问题。

2、内存管理实验内存管理是操作系统的核心功能之一,它直接影响系统的性能和稳定性。

在这个实验中,我们研究了动态内存分配和释放的机制。

使用 C++中的 new 和 delete 操作符来分配和释放内存。

通过观察内存使用情况和内存泄漏检测工具,了解了内存分配的效率和可能出现的内存泄漏问题。

同时,我们还探讨了内存分页和分段的概念,以及虚拟内存的工作原理。

通过模拟内存访问过程,理解了页表的作用和地址转换的过程。

3、文件系统实验文件系统是操作系统用于管理文件和目录的机制。

在这个实验中,我们对文件的创建、读写和删除进行了操作。

使用 C++的文件流操作来实现对文件的读写。

通过创建不同类型的文件(文本文件和二进制文件),并对其进行读写操作,熟悉了文件的打开模式和读写方式。

此外,还研究了文件的权限设置和目录的管理,了解了如何保护文件的安全性和组织文件的结构。

4、设备管理实验设备管理是操作系统与外部设备进行交互的桥梁。

操作系统lab2实验报告

操作系统lab2实验报告

操作系统lab2实验报告实验目的:本实验的目的是通过设计和实现一个简单的操作系统内核,加深对操作系统基本概念和原理的理解。

具体实验内容包括进程管理、内存管理和文件系统的设计与实现。

实验环境:1.操作系统:Linux2.编程语言:C语言一、实验背景1.1 操作系统简介操作系统是计算机系统中的一个重要组成部分,负责管理和控制计算机的各种资源,提供用户和应用程序的接口,以及协调和调度各种任务的执行。

1.2 实验目标本实验的主要目标是设计和实现一个简单的操作系统内核,包括进程管理、内存管理和文件系统等功能。

二、实验内容2.1 进程管理①进程创建描述进程创建的过程和相关数据结构,包括创建新进程的系统调用、进程控制块等。

②进程调度描述进程调度的算法和实现方式,包括进程调度队列、调度算法等。

③进程同步与通信描述进程同步和通信的机制和方法,包括信号量、互斥锁、条件变量等。

2.2 内存管理①内存分配描述内存分配的算法和实现方式,包括连续内存分配、非连续内存分配等。

②页面置换描述页面置换的算法和实现方式,包括最优页面置换算法、先进先出页面置换算法等。

2.3 文件系统①文件操作描述文件操作的系统调用和相关数据结构,包括文件打开、读写、关闭等。

②文件系统结构描述文件系统的组织结构和实现方式,包括超级块、索引节点、块位图等。

三、实验步骤3.1 环境搭建搭建实验环境,包括安装Linux操作系统、编译器等。

3.2 进程管理实现根据设计要求,实现进程创建、调度、同步与通信等功能。

3.3 内存管理实现根据设计要求,实现内存分配、页面置换等功能。

3.4 文件系统实现根据设计要求,实现文件操作和文件系统结构。

3.5 测试与调试编写测试用例,对实现的操作系统内核进行测试和调试,并记录实验结果。

四、实验结果分析分析测试结果,评估实验过程中遇到的问题和解决方法,总结操作系统内核的性能和功能特点。

五、实验总结对实验过程中的收获和经验进行总结,提出改进和优化的建议。

操作系统实习二报告

操作系统实习二报告

实验二主存储器空间的分配和回收一、实验题目:模拟在分页式管理方式下采用位示图来表示主存分配情况,实现主存空间的分配和回收。

二、实验目的:主存的分配和回收的实现与主存储器的管理方式有关,通过本实习理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。

三、实验内容:一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。

当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。

当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。

四、程序中使用的数据结构及符号说明:五、程序流程图:六、程序源代码:#include <stdlib.h>#include <stdio.h>typedef int datatype;typedef struct node{datatype pageNum,blockNum;struct node *next;}linknode;typedef linknode *linklist;linklist creatlinklist(int n)/*尾插法创建带头结点的单链表*/{linklist head,r,s;int x,y,i=0;head=r=(linklist)malloc(sizeof(linknode));printf("\n请分别输入页表的页号及块号(-1表示空):\n");printf("\n页号| 块号\n");while (i<n){scanf("%d %d",&x,&y);s=(linklist)malloc(sizeof(linknode));s->pageNum=x;s->blockNum=y;r->next=s;r=s;i++;}r->next=NULL;return head;}void init(int g[100][100],int N)/*初始化位示图,将值全置为零,0表示空闲状态*/{int i,j;for(i=0;i<100;i++){for(j=0;j<100;j++){g[i][j]=0; //全置为零}}g[N+1][0]=N*N; //在数组最后一个数的后面设置一个空间用来存放剩余空闲块数}linklist Init(linklist head,int g[100][100],int n,int N){linklist p;int i,j;p=head->next;if(n<=g[N+1][0]) //首先判断作业的页数是否小于等于位示图剩余空闲块的个数{while(p){i=p->blockNum/N;j=p->blockNum%N;g[i][j]=1;g[N+1][0]--;p=p->next;}}return head;}printStr(int g[100][100],int N)/*打印位示图*/{int i,j;printf("\n此时位示图为:\n");printf("\n ");for(i=0;i<N;i++){printf(" ");printf("%d",i);}printf("\n");for(i=0;i<N;i++){printf("%d",i);for(j=0;j<N;j++){printf(" ");printf("%d",g[i][j]);}printf("\n");}printf("\n");}void print(linklist head)/*输出带头结点的单链表*/{linklist p;p=head->next;printf("\n该页表为:\n");printf("\n");printf("\n 页号| 块号\n");while(p){printf("%11d%7d\n",p->pageNum,p->blockNum);p=p->next;}printf("\n");}linklist Dis(linklist head,int g[100][100],int n,int N){linklist p;int i,j;p=head->next;if(n<=g[N+1][0]) //首先判断作业的页数是否小于等于位示图剩余空闲块的个数{while(p){for(i=0;i<N;i++){for(j=0;j<N;j++){if(g[i][j]==0){p->blockNum=N*i+j; //将对应块号记录到页表g[i][j]=1; //将块置1,表示已被占用g[N+1][0]--; //剩余空闲块减1break; //跳出循环,进行下一个页的分配}}break; //跳出循环}p=p->next; //下一个页进行分配}return head;}}linklist Recy(linklist head,int g[100][100],int n,int N)/*回收已经完成的页*/ {int i,j;linklist p;p=head->next;while(p&&p->pageNum!=n) //找出要回收的页号{p=p->next;}if(p) //找到{i=p->blockNum/N;j=p->blockNum%N;g[i][j]=0; //将该块置0,表空闲状态g[N+1][0]++;p->blockNum=-1; //页表中对应的块号为空,置成-1}return head;}void main(){int m,n,N;int x,y,a,b,t;int graph[100][100];linklist head,Head;printf("\n*****分页式存储管理分配及回收算法*****\n");printf("\n请输入位示图字长:");scanf("%d",&N);printf("\n请输入已占用内存作业的页数:");scanf("%d",&m);head=creatlinklist(m);init(graph,N);head=Init(head,graph,m,N);printStr(graph,N);printf("\n当前空闲块数为:%d",graph[N+1][0]);printf("\n\n现在进行作业分配:\n");printf("\n请输入需要分配的作业的页数:");scanf("%d",&n);Head=creatlinklist(n);Head=Dis(Head,graph,n,N);print(Head);printStr(graph,N);printf("\n当前空闲块数为:%d",graph[N+1][0]);printf("\n\n您是否想回收已完成的页,“是”请按1,“否”请按0:");scanf("%d",&x);if(x) //判断是否要回收{printf("\n请输入您要回收的页号:");scanf("%d %d %d %d",&y,&a,&b,&t);head=Recy(head,graph,y,N);head=Recy(head,graph,a,N);head=Recy(head,graph,b,N);head=Recy(head,graph,t,N);printStr(graph,N);}printf("\n当前空闲块数为:%d",graph[N+1][0]);printf("\n");}七、运行结果:实习小结:本次实验是自己花了很多的时间去琢磨去尝试才完成的,虽然还不是很完美,但是在设计的过程中自己在对编程方面的逻辑思维得到了很好的锻炼。

《操作系统》实验报告

《操作系统》实验报告

一、实验目的1. 理解进程的概念及其在操作系统中的作用。

2. 掌握进程的创建、调度、同步和通信机制。

3. 学习使用进程管理工具进行进程操作。

4. 提高对操作系统进程管理的理解和应用能力。

二、实验环境1. 操作系统:Windows 102. 软件环境:Visual Studio 20193. 实验工具:C++语言、进程管理工具(如Task Manager)三、实验内容1. 进程的创建与销毁2. 进程的调度策略3. 进程的同步与互斥4. 进程的通信机制四、实验步骤1. 进程的创建与销毁(1)创建进程使用C++语言编写一个简单的程序,创建一个新的进程。

程序如下:```cpp#include <iostream>#include <windows.h>int main() {// 创建进程STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(si));si.cb = sizeof(si);ZeroMemory(&pi, sizeof(pi));// 创建进程if (!CreateProcess(NULL, "notepad.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {std::cout << "创建进程失败" << std::endl;return 1;}std::cout << "进程创建成功" << std::endl;// 等待进程结束WaitForSingleObject(pi.hProcess, INFINITE);// 销毁进程CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return 0;}```(2)销毁进程在上面的程序中,通过调用`WaitForSingleObject(pi.hProcess, INFINITE)`函数等待进程结束,然后使用`CloseHandle(pi.hProcess)`和`CloseHandle(pi.hThread)`函数销毁进程。

《操作系统》课内实验报告

《操作系统》课内实验报告

《操作系统》课内实验报告一、实验目的本次《操作系统》课内实验的主要目的是通过实际操作和观察,深入理解操作系统的基本原理和功能,掌握常见操作系统命令的使用,提高对操作系统的实际应用能力和问题解决能力。

二、实验环境本次实验在计算机实验室进行,使用的操作系统为 Windows 10 和Linux(Ubuntu 发行版)。

实验所使用的计算机配置为:Intel Core i5 处理器,8GB 内存,500GB 硬盘。

三、实验内容1、进程管理在 Windows 系统中,通过任务管理器观察进程的状态、优先级、CPU 使用率等信息,并进行进程的结束和优先级调整操作。

在 Linux 系统中,使用命令行工具(如 ps、kill 等)实现相同的功能。

2、内存管理使用 Windows 系统的性能监视器和资源监视器,查看内存的使用情况,包括物理内存、虚拟内存的占用和分配情况。

在 Linux 系统中,通过命令(如 free、vmstat 等)获取类似的内存信息,并分析内存的使用效率。

3、文件系统管理在 Windows 系统中,对文件和文件夹进行创建、复制、移动、删除等操作,了解文件的属性设置和权限管理。

在 Linux 系统中,使用命令(如 mkdir、cp、mv、rm 等)完成相同的任务,并熟悉文件的所有者、所属组和权限设置。

4、设备管理在 Windows 系统中,查看设备管理器中的硬件设备信息,安装和卸载设备驱动程序。

在 Linux 系统中,使用命令(如 lspci、lsusb 等)查看硬件设备,并通过安装内核模块来支持特定设备。

四、实验步骤1、进程管理实验(1)打开 Windows 系统的任务管理器,切换到“进程”选项卡,可以看到当前系统中正在运行的进程列表。

(2)选择一个进程,右键点击可以查看其属性,包括进程 ID、CPU 使用率、内存使用情况等。

(3)通过“结束任务”按钮可以结束指定的进程,但要注意不要随意结束系统关键进程,以免导致系统不稳定。

操作系统2实验4报告

操作系统2实验4报告

实验(四)文件操作与管理一、目的与要求1、目的随着社会信息量的极大增长,要求计算机处理的信息与日俱增,涉及到社会生活的各个方面。

因此,文件管理是操作系统的一个极为重要的组成部分。

学生应独立地用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。

从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。

2、要求(1)实际一个 n 个用户的文件系统,每个用户最多可保存 m 个文件。

(2)限制用户在一次运行中只能打开 l 个文件。

(3)系统应能检查打入命令的正确性,出错要能显示出错原因。

(4)对文件必须设置保护措施,如只能执行,允许读、允许写等。

在每次打开文件时,根据本次打开的要求,再次设置保护级别,即可有二级保护。

(5)对文件的操作至少应有下述几条命令:creat 建立文件。

delete 删除文件。

open 打开文件。

close 关闭文件。

read 读文件。

write 写文件。

二、实验题目(1)本实习设计一个 10 个用户的文件系统,每个用户最多可保存 10 个文件,一次运行中用户可打开 5 个文件。

(2)程序采用二级文件目录,即设置了主文件目录(MFD)和用户文件目录(UFD)。

前者应包含文件主(即用户)及他们的目录区指针;后者应给出每个文件主占有的文件目录,即文件名,保护码,文件长度以及他们存放的位置等。

另外为打开文件设置了运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。

(3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只修改读写指针,并不进行实际文件的读写操作。

三、实验源代码#include <cstdio>#include <cstring>#define SizeOfUserName 255#define SizeOfUser 10#define SizeOfFile 10#define SizeOfCommand 255#define SizeOfFileName 255char UserName[SizeOfUser][SizeOfUserName];long User;struct InfoOfFile {char Name[SizeOfFileName];bool safe[3];//Read,Write,Executelong status;//ready,open;}UFD[SizeOfUser][SizeOfFile];long num[SizeOfUser];long num_open[SizeOfUser];char z[4]="rwe";void ls()//列文件目录{char tmp[100];long i,j;printf("%20s%20s%20s\n","Name","Property","Status");for (i=0;i<num[User];i++){printf("%20s",UFD[User][i].Name);for (j=0;j<3;j++){if (UFD[User][i].safe[j]){tmp[j]=z[j];}else{tmp[j]='-';}}tmp[3]='\0';printf("%20s",tmp);if (UFD[User][i].status){printf("%20s\n","Opened");}else{printf("%20s\n","Ready");}}printf("%ld file(s) in total\n",num[User]);}long login()//切换用户{long i;char NameInput[SizeOfUserName];do{printf("Please input your ID:");scanf("%s",NameInput);i=0;while (i<SizeOfUser && strcmp(NameInput,UserName[i])!=0){i++;}if (strcmp(NameInput,UserName[i])!=0){printf("Bad UserID.\n");}}while (strcmp(NameInput,UserName[i])!=0);return i;}void init()//初始化{long i,j,k;char tmp[4];memset(num_open,0,sizeof(num_open));//读入用户名列表freopen("record.txt","r",stdin);for (i=0;i<SizeOfUser;i++){scanf("%s",UserName[i]);}//读入文件列表for (i=0;i<SizeOfUser;i++){scanf("%ld",&num[i]);for (j=0;j<num[i];j++){scanf("%s%s",UFD[i][j].Name,tmp);for (k=0;k<3;k++){if (tmp[k]=='-'){UFD[i][j].safe[k]=0;}else{UFD[i][j].safe[k]=1;}}UFD[i][j].status=0;}}freopen("con","r",stdin);User=login();ls();}void create()//创建文件{long i;char filename[SizeOfFileName];char prop[128];if (num[User]==SizeOfFile)//保存已满{printf("Failed... You can only save %ld files\n",SizeOfFile);return;}printf("Input filename and property>");scanf("%s%s",filename,prop);for (i=0;i<num[User];i++){if (strcmp(filename,UFD[User][i].Name)==0)//重名{printf("Failed... File %s already exists\n",filename);return;}}strcpy(UFD[User][num[User]].Name,filename);for (i=0;i<3;i++)//设置属性{if (prop[i]=='-'){UFD[User][num[User]].safe[i]=0;}else{UFD[User][num[User]].safe[i]=1;}}UFD[User][num[User]].status=0;++num[User];printf("Success!\n");}void open()//打开文件{long i;char filename[SizeOfFileName];if (num_open[User]==5){printf("Failed... You have already opened 5 files\n");//打开文件数已到上限return ;}printf("Input filename>");scanf("%s",filename);for (i=0;i<num[User];i++){if (strcmp(filename,UFD[User][i].Name)==0){if (UFD[User][i].status==0)//文件未占用{UFD[User][i].status=1;num_open[User]++;printf("Success!\n");}else//已被打开{printf("Failed... File %s is already opened\n",filename);}return;}}printf("Failed... No such file\n"); //找不到文件}void close()//关闭文件{long i;char filename[SizeOfFileName];printf("Input filename>");scanf("%s",filename);for (i=0;i<num[User];i++){if (strcmp(filename,UFD[User][i].Name)==0){if (UFD[User][i].status==1)//成功{UFD[User][i].status=0;num_open[User]--;printf("Success!\n");}else//文件并未打开{printf("Failed... File %s is not opened\n",filename);}return;}}printf("Failed... No such file\n"); //找不到文件}void read()//读文件{long i;char filename[SizeOfFileName];printf("Input filename>");scanf("%s",filename);for (i=0;i<num[User];i++){if (strcmp(filename,UFD[User][i].Name)==0){if (UFD[User][i].safe[0]==0)//属性设置为不可读{printf("Failed... File %s is not readable\n",filename);return;}if (UFD[User][i].status==1)//文件已打开{printf("Failed... File %s is already opened\n",filename);return;}printf("Success!\n");//成功return;}}printf("Failed... No such file\n");//找不到文件}void write()//写文件{long i;char filename[SizeOfFileName];printf("Input filename>");scanf("%s",filename);for (i=0;i<num[User];i++){if (strcmp(filename,UFD[User][i].Name)==0){if (UFD[User][i].safe[1]==0)//属性设置为不可写{printf("Failed... File %s is not writable\n",filename);return;}if (UFD[User][i].status==1)//已打开{printf("Failed... File %s is already opened\n",filename);return;}printf("Success!\n");//成功return;}}printf("Failed... No such file\n");//找不到文件}void mydelete()//删除文件{long i,j;char filename[SizeOfFileName];printf("Input filename>");scanf("%s",filename);for (i=0;i<num[User];i++){if (strcmp(filename,UFD[User][i].Name)==0){if (UFD[User][i].status==1)//文件正被打开{printf("Failed... File %s is already opened\n",filename);return;}num[User]--;for (j=i;j<num[User];j++){UFD[User][j]=UFD[User][j+1];}printf("Success!\n");//成功return;}}printf("Failed... No such file\n");//找不到文件}void save()//保存本次信息{FILE *fp=fopen("record.txt","w");long i,j,k;char tt[4]="rwe";char tmp[4];//保存用户列表for (i=0;i<SizeOfUser;i++){fprintf(fp,"%s\n",UserName[i]);}//保存文件列表for (i=0;i<SizeOfUser;i++){fprintf(fp,"%ld\n",num[i]);for (j=0;j<num[i];j++){for (k=0;k<3;k++){if (UFD[i][j].safe[k]){tmp[k]=tt[k];}else{tmp[k]='-';}}tmp[3]=0;fprintf(fp,"%s %s\n",UFD[i][j].Name,tmp);}}printf("Success!\n");//成功fclose(fp);}void work()//交互主函数{bool over=0;char command[SizeOfCommand];while (!over){printf("%s>",UserName[User]);scanf("%s",command);if (strcmp(command,"login")==0){User=login();ls();continue;}if (strcmp(command,"bye")==0){printf("Byebye.\n");over=1;continue;}if (strcmp(command,"ls")==0 || strcmp(command,"dir")==0){ls();continue;}if (strcmp(command,"create")==0){create();continue;}if (strcmp(command,"delete")==0){mydelete();continue;}if (strcmp(command,"open")==0){open();continue;}if (strcmp(command,"close")==0){close();continue;}if (strcmp(command,"read")==0){read();continue;}if (strcmp(command,"write")==0){write();continue;}if (strcmp(command,"save")==0){save();continue;}printf("Bad command.\n");}}int main(){init();work();return 0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SHANGHAI UNIVERSITY计算机操作系统实验报告(实验四、五、六)学院计算机工程与科学学院专业计算机科学与技术学号06122565姓名金玉倩教师吴绍春日期2010-2《计算机操作系统》实验报告实验四题目:Linux文件系统实验姓名:金玉倩学号:06122565 实验日期:2009.1实验目的:1.掌握操作系统中文件分类的概念。

2.了解Linux文件系统管理文件的基本方式和特点。

3.学会使用Linux文件系统的命令界面和程序界面的基本要领。

实验内容:1.用shell命令查看Linux文件类型。

Linux的文件类型包括:普通文件(—)、目录文件(d)、字符设备文件(c)、块设备文件(b)硬链接文件、套接口文件(s)、符号链接文件(l)和管道文件(p)。

2.用shell命令了解Linux文件系统的目录结构。

3.用命令分别建立硬链接文件和符号链接文件。

通过ls -il命令所示的inode、链接计数观察他们的区别。

◆思考题:建立硬链接文件和建立符号链接文件有什么区别?答:硬连接指通过索引节点来进行的连接。

在Linux中,多个文件名指向同一索引节点是存在的。

一般这种连接就是硬连接。

硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。

其原因如上所述,因为对应该目录的索引节点有一个以上的连接。

只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。

也就是说,文件才会被真正删除。

与硬连接相对应的另一种连接,称为符号连接(软连接)。

软链接文件有点类似于Windows的快捷方式。

它实际上是特殊文件的一种。

在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

如上图实验所示:touch f1(创建一个f1的文件)ln f1 f2 创佳一个f2的硬连接ln -s f1 f3 创建一个f3的软连接此时如果删除f3,对f1、f2无影响;如果删除f2,对f1、f3也无影响,如果删除f1,那么因为f2也应用f1,所以并不影响f2节点的,cat创建的文件仍然存在;但是此时f3因为是软连接,导致f3失效。

如果删除f1、f2 ,那么cat创建的文件会被删除。

4.复习Unix或Linux操作系统文件目录信息i节点的概念。

编程观察看指定文件的inode 信息。

将书上例程8的内容输入p3.c后,编译执行。

5.再来一个更有趣的实验。

修改父进程创建子进程的程序,用显示程序段、数据段地址的方法,说明子进程继承父进程的所有资源。

再用父进程创建子进程,子进程调用其它程序的方法进一步证明执行其它程序时,程序段发生的变化。

将书上例程10显示程序、数据段地址的程序的内容输入p4.c、p5.c后,编译执行。

6.编写一个涉及流文件的程序。

要求:A.以只读方式打开一个源文本文件B.以只读方式打开另一个源文本文件C.以只读方式打开目标文本文件D.将两个源文件内容复制到目标文件E.将目标文件改为指定的属性F.显示目标文件将书上例程11的内容输入p6.c后,编译执行。

体会:也许这学期的三个实验中就这个最难了。

不仅有书上的概念,书上讲的不清楚的,还得自己从网上搜集资料。

对于Linux中文件的软硬链接理解得算是透彻了,对于i节点的理解也更深入了一步,Unix系统的内核结构真的是非常方便实用,基于它衍生的许多技术都将是我未来关注学习的焦点。

附录:(源程序)//p3.c#include<sys/stat.h>#include<sys/types.h>#include<sys/sysmacros.h>#include<stdio.h>#include<time.h>#include<unistd.h>#include<string.h>#include<errno.h>#define TIME_STRING_LEN 50char *time2String (time_t tm,char *buf){struct tm *local;local=localtime(&tm);strftime(buf,TIME_STRING_LEN,"%c",local);return buf;}int ShowFileInfo(char *file){struct stat buf;char timeBuf[TIME_STRING_LEN];if(lstat(file,&buf)){perror("lstat()error");return 1;}printf("\nFile:%s\n",file);printf("1)On device(major/minor):%d %d,inode number:%ld\n",major(buf.st_dev),minor(buf.st_dev),buf.st_ino);printf("2)Type:%07o\t Permission:%05o\n",buf.st_mode & S_IFMT,buf.st_mode & ~(S_IFMT));printf("3)Over id:%d\t Group id:%d\t \n4)Number of hard links:%d\n",buf.st_uid,buf.st_gid,buf.st_nlink);printf("5)Size:%ld\t \n6)Last access:%s",buf.st_size,time2String(buf.st_atime,timeBuf));printf("\n Last modify inode:%s\n\n",time2String(buf.st_atime,timeBuf));printf("7)Datablocks:%d , %d\t\n",buf.st_blksize,buf.st_blocks);return 0;}int main(int argc,char *argv[]){int i,ret;for(i=1;i<argc;i++){ret=ShowFileInfo(argv[i]);if(argc-i>1)printf("\n");}return ret;}//p4.c#include<stdio.h>extern int etext,edata,end;main(){printf("etext:%6x \t edata:%6x \t end:%6 \n",&etext,&edata,&end);}//p5.c#include<stdio.h>#include<string.h>#include<sys/types.h>#include<stdlib.h>#include<unistd.h>#define SHW_ADR(ID,I) printf("The id %s \t is at adr:%8x\n",ID,&I);extern int etext,edata,end;char *cptr="Hello World.\n";char buffer1[25];main(){ void showit(char *);int i=0;printf("Adr etext:%8x\t Adr edata:%8x Adr end:%8x\n\n",&etext,&edata,&end);SHW_ADR("main",main);SHW_ADR("showit",showit);SHW_ADR("cptr",cptr);SHW_ADR("buffer1",buffer1);SHW_ADR("i",i);strcpy(buffer1,"A demonstration\n");write(1,buffer1,strlen(buffer1)+1);for(;i<1;++i)showit(cptr);}voidshowit(char *p){ char *buffer2;SHW_ADR("buffer2",buffer2);if ((buffer2=(char *)malloc((unsigned)(strlen(p)+1)))!=NULL){ strcpy(buffer2,p);printf("%s",buffer2);free(buffer2);}else{ printf("Allocation error.\n");exit(1);}}//p6.c#include<sys/types.h>#include<stdio.h>int main(int argc,char *argv[]){ char s[1024];FILE *fp;if((fp=fopen(argv[1],"r"))!=(FILE*)0){ while((fgets(s,1024,fp))!=(char *)0)puts(s);}else{ fprintf(stderr,"file open error.\n");exit(1);}exit(0);}实验五题目:FAT 文件系统实验姓名:金玉倩学号:06122565 实验日期:2009.1实验目的:1、从系统分析的角度出发,了解FAT文件系统的组织结构和文件的存储方式。

2、进一步理解操作系统文件管理的基本思想。

实验内容:1..进入DEBUG环境,装入FAT文件系统结构。

执行命令:L 0 0 0 212.观察1.44M软盘中FAT12文件系统结构。

执行命令:D 0000软盘有两面,每面80个磁道,每个磁道18个扇区,每个扇区512个字节,所以软盘的容量是2*80*18*512 = 1474560, 1474560/1024/1024大约为1.44M。

3.分析文件分配表结构,了解用簇链映射的文件的链式存储结构。

相关文档
最新文档