⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os.cpp

📁 模拟操作系统,主要完成了文件管理,程管理等
💻 CPP
字号:
#include "Porcess.h"
#include "File.h"
#include "Memory.h"

MangerFile()
{
		char name[20],buffer[64];
	int attribute,type,length,I,a;
	/*建立文件,模拟磁盘*/
	if((fc=fopen("c:\\c.txt","w+"))==NULL)
	{
		printf("无法打开文件\n");
		return 0;
	}
	/*初始化已打开文件夹*/
	openfile.length=0;
	/*初始化磁盘*/
	/*初始化文件分配表*/
	buffer1[0]=buffer1[1]=buffer1[2]=255; /*磁盘第0,1块存放FAT表,第2块存放根目录*/
	for(I=3;I<64;I++)
		buffer1[I]=0;
	buffer1[13]=buffer1[49]=254;    /*假定模拟磁盘中有两个坏盘块:第13块和49块*/
	fwrite(buffer1,64L,1,fc);
	for(I=0;I<64;I++)
		buffer1[I]=0;
	fwrite(buffer1,64L,1,fc);
	/*初始化根目录*/
	for(I=0;I<8;I++)
		buffer2[I].name[0]='$';
	fwrite(buffer2,64L,1,fc);
	/*已初始化已打开文件表*/
	while(1)
	{
		printf("\n0 -结束\n");
		printf("1 -建立文件\n");
		printf("2 -打开文件\n");
		printf("3 -读文件\n");
		printf("4 -写文件\n");
		printf("5 -关闭文件\n");
		printf("6 -删除文件\n");
		printf("7 -建立目录\n");
		printf("8 -显示目录内容\n");
		printf("9 -删除目录\n");
		printf("10-显示文件内容\n");
		printf("11-改变文件属性\n");
		printf("选择功能项(0~11):");
		scanf("%d",&a);
		switch(a)
		{
		case 0:         /*a=程序结束*/
			fclose(fc);
			return 0;
		case 1:        /*a=1建立文件*/
			printf("输入文件路径名和文件属性(1-只读文件,3-只读系统文件,4-普通文件):");
			scanf("%s%d",name,&attribute);
			create_file(name,attribute);  /*建立文件*/
			break;
		case 2:                       /*a=2打开文件*/
			printf("输入文件路径名和操作类型(0-读文件,1-写文件):");
			scanf("%s%d",name,&type);
			open_file(name,type);        /*打开文件*/
			printf("文件%s已经打开.",name);
			break;
		case 3:                      /*a=3读文件*/
			printf("输入文件路径和读长度");
			scanf("%s%d",name,&length);
			read_file(name,length);      /*读文件*/
			break;
		case 4:                      /*a=4写文件*/
			printf(" 输入文件路径名:");
			scanf("%s",name);
			printf(" 输入写的内容和和写长度");
			scanf("%s%d",buffer,&length);
			write_file(name,buffer,length); /*写文件*/
			break;
		case 5:                       /*a=5关闭文件*/
			printf("输入文件路径名");
			scanf("%s",name);
			close_file(name);             /*关闭文件*/
			break;
		case 6:                      /*a=6删除文件*/
			printf("输入文件路径名");
			scanf("%s",name);
			deletefile(name);                /*删除文件*/
			break;
		case 7:                      /*a=7 建立目录*/
			printf("输入目录路径名");
			scanf("%s",name);
			md(name);                    /*建立目录*/
			break;
		case 8:                      /*a=8显示目录*/
			printf("输入目录路径名");
			scanf("%s",name);
			dir(name);                   /*显示目录*/
			break;
		case 9:                      /*a=9删除目录*/
			printf(" 输入文件路径名");
			scanf("%s",name);
			rd(name);                   /*删除目录*/
			break;
		case 10:                    /*a=10显示文件*/
			printf(" 输入文件路径名");
			scanf("%s",name);
			typefile(name);            /*显示文件*/
			break;
		case 11:                   /*a=11改变文件属性*/
			printf(" 输入文件路径名和文件属性(1-只读文件,3-只读系统文件,4-普通文件):");
			scanf("%s%d",name,&attribute);
			change(name,attribute);
		}/* switch */
	}/* while */
}

Process()
{
	int num,j,block;
	run=ready.head=ready.tail=block=-1;
	pfree=0;
	for(j=0;j<pn-1;j++)
		pcbarea[j].next=j+1;
	pcbarea[pn-1].next=-1;
	printf("输入进程编号(避免编号的冲突,以负数输入结束,最多可以创建10个进程:\n");
	scanf("%d",&num);
	while(num>=0)
	{
		create(num);
		scanf("%d",&num);
	}
	
	sheduling();
	if(run!=-1)
	{
		printf("进程标识符  进程状态  寄存器内容:ax bx cx dx pc psw:\n");
		printf("%10d%10d%15d%3d%3d%3d%3d%3d\n",pcbarea[run].name,
			pcbarea[run].status,pcbarea[run].ax,pcbarea[run].bx,pcbarea[run].cx,pcbarea[run].dx,pcbarea[run].pc,
			pcbarea[run].psw);
	}
}

MangerMemory()
{
	int i, a;
	float xk;
	char J;
	free_table[0].address=10240;
	free_table[0].length=102400;
	free_table[0].flag=1;
	for(i=1; i<m; i++)
		free_table[i].flag=0;
	for(i=0; i<n; i++)
		used_table[i].flag=0;
	while(1)
	{
		printf("选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)\n");
		printf("选择功项(0~3):");
		scanf("%d",&a);
		switch(a)
		{
		case 0: 
			return 0;
		case 1:
			printf("输入作业名J和作业所需长度xk :");
			J = getchar();
			J = getchar();
			scanf("%f",&xk);
			allocate(J, xk);
			break;
		case 2:
			printf("输入要回收分区的作业名");
			J = getchar();
			J = getchar();
			reclaim(J);
			break;
		case 3:
			printf("输出空闲区表:\n起始地址   分区长度   标志\n");
			for(i=0; i < m; i++)
				printf("%5.0f%10.0%6d\n",free_table[i].address,free_table[i].length,free_table[i].flag);
			printf(" 按任意键,输出已分配区表\n");
			getchar();
			printf("输出已分配区表:\n起始地址        分区长度    标志\n");
			for(i=0; i<n; i++)
				if(used_table[i].flag!=0)
					printf("%8.0f%16.0f%8c\n",used_table[i].address, used_table[i].length, used_table[i].flag);
				else
					printf("%8.0f%16.0f%8d\n",used_table[i].address, used_table[i].length,used_table[i].flag);
				break;
		default:printf("没有该选项\n");
		}/*case*/
	}/*while*/
}

main()
{
	int a;
	while(1)
	{
		printf("\n0-结束操作\n");
		printf("1-管理文件\n");
		printf("2-进程管理\n");
		printf("3-内存管理\n");
		printf("4-设备分配\n");
		scanf("%d",&a);
		switch(a)
		{
		case 0:         /*a=程序结束*/
			return 0;
		case 1:
			MangerFile();
			break;
		case 2:
			Process();
			break;
		case 3:
			MangerMemory();
			break;
		}
	}
}/*main()结束*/


/*
main()
{
	
	int num,j,block;
	run=ready.head=ready.tail=block=-1;
	pfree=0;
	for(j=0;j<n-1;j++)
		pcbarea[j].next=j+1;
	pcbarea[n-1].next=-1;
	printf("输入进程编号(避免编号的冲突,以负数输入结束,最多可以创建10个进程:\n");
	scanf("%d",&num);
	while(num>=0)
	{
		create(num);
		scanf("%d",&num);
	}
	
	sheduling();
	if(run!=-1)
	{
		printf("进程标识符  进程状态  寄存器内容:ax bx cx dx pc psw:\n");
		printf("%8d%10d%3d%3d%3d%3d%3d%3d\n",pcbarea[run].name,
			pcbarea[run].status,pcbarea[run].ax,pcbarea[run].bx,pcbarea[run].cx,pcbarea[run].dx,pcbarea[run].pc,
			pcbarea[run].psw);
	}
}/ *main()* /*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -