天津理工大学操作系统实验2
天津理工大学计算机专业数据库实验二

实验报告学院(系)名称:计算机与通信工程学院姓名范学号2009 专业计算机科学与技术班级中加4班实验项目数据库控制与编程课程名称数据库系统概论课程代码实验时间2011年11月29日实验地点主校区7—219批改意见成绩教师签字:一.实验目的以一种开发环境为例,使学生初步掌握通过编程的方式对数据库进行操作,为进行数据库课程设计做准备。
二.实验工具软硬件环境编写访问数据库的应用程序来对数据库进行各种数据操作,编程工具由导师指定,学生可以使用指导老师指定的工具,也可自己选择编程工具。
软件环境:Windows 2000MS SQL Server硬件环境:P4 2.4GHz 256内存三.实验内容和要求所有的SQL操作均在自己建立的TEMP数据库里进行,根据以下要求认真填写实验报告,并且提交源程序,保证可正确编译运行。
使用SQL对数据进行完整性控制,用实验验证:当操作违反了完整性约束条件的时候,系统是如何处理的。
熟悉存储过程的建立及使用,熟悉带输入参数和输出参数的存储过程。
I.使用SQL对数据进行完整性控制,用实验验证:当操作违反了完整性约束条件的时候,系统是如何处理的。
II.熟悉存储过程的建立及使用,熟悉带输入参数和输出参数的存储过程。
a)查询学生表中的所有学生,并实现调用。
b)修改学号为@sno学生的姓名,性别,年龄,系别,并实现调用。
c)向学生表中插入学生,并实现调用。
d)查询姓名为@sname选修的数据库课程的成绩,并实现调用。
e)查询选修了课程名为@cname并且成绩高于该门课程平均分的学生学号和成绩,并实现调用。
III.利用指定的编程语言完成一个简单程序,要求具有对数据的增加、修改和删除操作;基于一个给定的java应用程序,熟悉掌握建立ODBC和利用ODBC来凝结数据库的编程方法,建立一个应用程序,具有向学生、课程、选课表增加修改删除记录的功能,选取其中一个功能用存储过程实现。
需要接取程序运行界面。
实验2操作系统环境[定稿]
![实验2操作系统环境[定稿]](https://img.taocdn.com/s3/m/d3f0a6d4d4bbfd0a79563c1ec5da50e2524dd11c.png)
000 000 2.1 操作系统的计算环境 0 00 2.1.1 操作系统计算环境的背景 0 00 本实验帮助回顾Windows 2000/XP、UNIX和Linux的计算环境术语,加深理解有关操作系统的基础概念。学生还将调查在学校或其他机构中Windows、UNIX和Linux的使用情况,看哪些机构在使用Windows、UNIX或者Linux系统;研究Web站点,看哪些因特网网站 (尤其是简体中文网站) 分别支持着Windows、UNIX和Linux操作系统的应用。000
2.1.2 练习与实验 0 00 本节“练习与实验”的目的是:000 通过实验,加深对以下内容的理解:000 1) 基本的计算机硬件组件;000 2) 计算机操作系统;000 3) Windows的发展和版本00 4) UNIX和Linux的历史和版本;000 5) Windows XP、UNIX或Linux操作环境。000
实验2 操作系统环境 调查在机构、学校和学生中Windows、UNIX和Linux操作系统的使用情况。0
0 分别研究支持Windows和Linux的Web站点。000
1. 工具/准备工作0 00 在开始本实验之前,请回顾教科书的相关内容。000 请联系指导老师或者熟识网络技术的人士,如学校或企业信息技术部门的职员,了解你所在的学校 (或者其他机构) 中使用了哪些服务器和网络操作系统,找出是否在用Windows 2000/XP、UNIX和Linux以及在哪里使用这些操作系统。00
需要准备一台带有浏览器,能够访问因特网的计算机。000
2. 实验内容与步骤0 0 (1) 识别一台计算机的4个主要硬件组成部分。00 1) __运算器___
000 2) ___控制器 0
00 3) 存储器
00 4) 输入输出设备 0
0 (2) 在空格中,填写3个概念中的一个:内核、shell或者文件系统。00
1) shell_____________ 表现为用户界面,把用户的需求翻译为系统活动。0
操作系统---实验二

实验报告学院(系)名称:计算机与通信工程学院【实验过程记录(源程序、测试用例、测试结果及心得体会等)】一.处理机调度算法的实现:(见如下算法表)二.代码的实现:#include <stdio.h>#include <stdlib.h>typedef struct pcb{int name;int right;int needt;}PCB;typedef PCB SeqList[7]; //声明所要创建的索引表用来存放各个进程的信息void inputPro(SeqList R){ //初始化及输入所需要的进程的所有信息包括进程名,int i; //优先级以及运行时间R[0].name=0;R[0].right=0;R[0].needt=0;R[6].name=0;R[6].right=0;R[6].needt=0;printf("------请输入五个进程的信息------\n\n");for(i=1;i<=5;i++) {printf("请输入进程第%d个进程信息:\n",i);scanf("%d,%d,%d",&(R[i].name),&(R[i].right),&(R[i].needt));}}void insertSort(SeqList M,int n,int count){ //利用顺序索引表来对各个进程按照其各自int i,j; //优先级进行排序for(i=n;i<=count;i++)if(M[i].right>=M[i-1].right){M[0]=M[i];for(j=i-1;M[0].right>=M[j].right;j--)M[j+1]=M[j];M[j+1]=M[0];}}void move_PCB(SeqList S){ //对排好的进程选出优先级最大的进程,然后进行输出其PCB *p,*s; //信息,进而使之后的满足条件的进程同样输出int count=5,n=2;s=S;s=s+1;p=s;insertSort(S,n,count);while(s->name!=0){if(s->needt==0){s=s+1;p=s;count--;n++;}printf("当前进程名是%d,当前优先级是:%d,剩余时间是:%d,运行之后的信息是:\n\n",s->name,s->right,s->needt);s->right=s->right-1;s->needt=s->needt-1;printf("\n --当前运行的进程--\t--优先级--\t--时间--\n\n");printf("---%d---\t\t---%d---\t\t---%d---\n\n",s->name,s->right,s->needt);insertSort(S,n,count);}printf("全部进程运行完毕\n\n");}void main() //主函数通过调用上述函数,从而实现本次试验的功能效果{SeqList A;inputPro(A);move_PCB(A);}三.实例测试:四.实验的心得体会:在本次实验中,我没有利用链式队列将各个进程进行排序,而是选用数组来对进程的排序进行处理,在今后的实验中希望自己能够多利用指针来处理问题。
操作系统实验报告-实验2-常用开发工具+Linux进程管理

实验报告模板四、实验结果(含程序、数据记录及分析和实验总结等)1.编写一个helloworld.c程序,使用下列选项对它进行编译:-I,-D,-E,-c,-o,-l。
编写好的helloworld.c使用-I,包含myinclude目录下的文件,显示未找到使用-D定义宏,并使用-o输出,运行成功使用-E对helloworld.c文件进行预处理,由于未加-o,所以将结果直接输出到控制台:-c 表示仅仅汇编及编译代码,不进行链接。
也就是将源代码编译成.o文件。
-o已经在前面使用过,指定输出文件名-l,如果为-lname,则链接时装载名为libname.a的函数库,如图,载入了libm.a 库进行编译:2.利用gdb调试下面的程序:/*dbme.c*/#include <stdio.h>#include <stdlib.h>#define BIGNUM 1000void index_m(intary[], float fary[]);int main( ){intintary[100];float fltary[100];index_m(intary,fltary);exit(EXIT_SUCCESS);}void index_m(intary[],float fary[]){int i;float f=3.14;for (i=0; i<BIGNUM;++i){ary[i]=i;fary[i]=i*f;}}(1)使用带-g选项的gcc命令对该程序进行编译$gcc–g dbme.c–o dbme,然后运行该程序$ ./dbme,屏幕显示什么?注意,此处如果使用BIGNUM的常量,则会显示正常退出。
无奈直接将BIGNUM换为1000,编译后运行显示段错误。
(2)用程序名dbme作为参数启动gdb。
(3)在gdb环境下运行该程序,gdb给出的程序错误出现在哪里?利用backtree命令生成导致错误的函数树。
操作系统实验2--银行家算法

操作系统实验2--银行家算法(总9页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--操作系统课程设计报告课程名称:银行家算法姓名:刘成启学号:149班级:计算机1008班指导老师:袁宁共享资源分配与银行家算法一、实验目的[问题描述]本题主要内容是模拟实现资源分配。
银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
通过对这个算法的设计,让学生能够对书本知识有更深的理解,在操作和其它方面有更高的提升。
二、实验内容[基本要求]具体用银行家算法实现资源分配。
要求如下:(1) 设计一个3个并发进程共享3类不同资源的系统,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。
(2) 设计用银行家算法,实现资源分配,应具有显示或打印各进程依次要求申请的资源数以及依次分配资源的情况。
(3) 确定一组各进程依次申请资源数的序列,输出运行结果。
[方案设计及开发过程]1银行家分配算法,顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行加资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。
在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。
如果资源分配不得到就会发生进程循环等待资源,每个进程都无法继续执行下去的死锁现象。
把个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。
当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。
“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。
显然,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁.2.算法描述银行家算法:设进程I提出请求Request[N],则银行家算法按如下规则进行判断。
天津大学计算机科学与技术-操作系统原理实验2

操作系统实验2 (一)实验目的完成一个监视指定的若干目录变动情况的(服务)程序。
(二)实验内容利用inotify机制进行文件或文件夹的监控。
(三)实验结果fileMonitor为程序名称,源码如下:#include <sys/inotify.h>#include <errno.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <signal.h>#include <syslog.h>#include <fcntl.h>#include <sys/resource.h>#include <errno.h>//#define _DEBUG#define _DAEMON#define EVENT_NUM 16#define BUF_SIZE 10240#ifdef _DAEMONchar * fileConf = "/etc/fileMonitor.conf";char * fileScan = "/etc/fileMonitor.scan";char * fileLog = "/etc/fileMonitor.log";#elsechar * fileConf = "fileMonitor.conf";char * fileScan = "fileMonitor.scan";char * fileLog = "fileMonitor.log";struct wd_name{int wd;char * name;};int wd_NUM = 0;struct wd_name * wd_array;//struct stat buf; // for detimine the type of file.const int filenameLen = 500;const int filelistLen = 10000;char files[10000][500];char buffer[BUF_SIZE];char logmsg[500];FILE * fplog;int fd, wd;char *offset = NULL;struct inotify_event *event;int len, tmp_len;char strbuf[16];int i = 0;int m_argc;char **m_argv;int sleeptime=1;char * event_array[]={"File was accessed","File was modified","File attributes were changed","writtable file closed","Unwrittable file closed","File was opened","File was moved from X","File was moved to Y","Subfile was created","Subfile was deleted","Self was deleted","Self was moved","Backing fs was unmounted","Event queued overflowed","File was ignored"};int init(int argc, char **argv);int readConfig(char * filename);int resetConfig(char * filename);int readScan(char * filename, int cur);int parseCmd(char * filename,int argc, char **argv);int execCmd(char** dirs, char** f_files, char** filetypes, int dsize,int fsize, int tsize, char * filename, int flag);// no recursivelyint execCmdN(char** dirs,int dsize, char * filename,int cur);// recursivelyint execCmdR(char** dirs, int dsize, char * filename,int cur);// with file typeint execCmdT(char** dirs, char** filetypes, int dsize, int tsize, char * filename,int cur);// only filesint execCmdF(char** f_files,int fsize,int cur);char * getTime(){time_t now;struct tm *timenow;char strtemp[500];time(&now);timenow = (struct tm *)localtime(&now);return (char*)asctime(timenow);//printf("recent time is : %s \n", asctime(timenow));}//for selectint isready(int fd){int rc;fd_set fds;struct timeval tv;FD_ZERO(&fds);FD_SET(fd, &fds);_sec = _usec = 0;rc = select(fd+1, &fds, NULL, NULL, &tv);if( rc<0 ) //errorexit(-1);return FD_ISSET(fd, &fds) ? 1: 0;}//for daemon#define LOCKFILE "/var/run/fileMonitor.pid"#define LOCKMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)int daemonize(const char *cmd){int i,fd0,fd1,fd2;pid_t pid;struct rlimit r1;struct sigaction sa;umask(0); //Clear file creation maskif(getrlimit(RLIMIT_NOFILE,&r1) < 0){printf("getrlimit error.\n");exit(1);}if((pid = fork()) < 0 ){printf("fork1 error.\n");exit(2);}else if(pid > 0)//Parent{exit(0);}setsid();sa.sa_handler = SIG_IGN;sigemptyset(&sa.sa_mask);sa.sa_flags = 0;if(sigaction(SIGHUP,&sa,NULL)<0){printf("sigaction error.\n");exit(3);}if((pid=fork()) < 0){printf("fork2 error.\n");exit(2);}else if(pid > 0){exit(0);}if(chdir("/") < 0){printf("chdir error.\n");exit(4);}//close(0); /* close stdin */ // for file.scan and file.conf //close(1); /* close stdout */ // for file.scan and file.conf //close(2); /* close stderr */openlog(cmd,LOG_PID, LOG_USER);syslog(LOG_INFO,"fileMonitor Start\n");}int lockfile(int fd){struct flock f1;f1.l_type = F_WRLCK;f1.l_start = 0;f1.l_whence = SEEK_SET;f1.l_len = 0;return(fcntl(fd,F_SETLK,&f1));}int already_running(void){int fd;char buf[16];fd = open(LOCKFILE,O_RDWR|O_CREAT,LOCKMODE);if(fd < 0){printf("Can't Open %s:%s\n",LOCKFILE,strerror(errno));syslog(LOG_INFO,"Can't Open %s:%s",LOCKFILE,strerror(errno));exit(1);}if(lockfile(fd) < 0){if(errno == EACCES || errno == EAGAIN){close(fd);return 1;}printf("Can't lock %s:%s\n",LOCKFILE,strerror(errno));syslog(LOG_INFO,"Can't lock %s:%s",LOCKFILE,strerror(errno));exit(1);}ftruncate(fd,0);sprintf(buf,"%ld",(long)getpid());write(fd,buf,strlen(buf));return 0;}void sigterm(int signo){syslog(LOG_INFO,"got SIGTERM,EXIT");fclose(fplog);closelog();exit(0);}void reread(void){syslog(LOG_INFO,"Re-read configuration file ok");init(m_argc, m_argv);}void sighup(int signo){syslog(LOG_INFO,"Re-Reading configuration file");reread();}int main(int argc, char **argv){#ifdef _DAEMONstruct sigaction sa;daemonize(argv[0]);if(already_running()){printf("fileMonitor already running\n");syslog(LOG_INFO,"fileMonitor already running\n");exit(2);}sa.sa_handler = sigterm;sigemptyset(&sa.sa_mask);sigaddset(&sa.sa_mask,SIGTERM);sa.sa_flags = 0;if(sigaction(SIGTERM,&sa,NULL) < 0){syslog(LOG_INFO,"Can't Catch SIGTERM:%s",strerror(errno));exit(1);}sa.sa_handler = sighup;sigemptyset(&sa.sa_mask);sigaddset(&sa.sa_mask,SIGHUP);sa.sa_flags = 0;if(sigaction(SIGHUP,&sa,NULL) < 0){syslog(LOG_INFO,"Can't catch SIGHUP:%s",strerror(errno));exit(1);}#endifm_argc = argc;m_argv = argv;fd = inotify_init();if (fd < 0) {#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Fail to initialize inotify.\n");syslog(LOG_INFO,logmsg);#elseprintf("Fail to initialize inotify.\n");#endifexit(-1);}fplog = fopen(fileLog,"wb");init(m_argc, m_argv);memset(logmsg,0,500);while(1){if (isready(fd)){if(len = read(fd, buffer, BUF_SIZE)) {offset = buffer;#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s\tSome event happens, len = %d.\n",getTime(), len);syslog(LOG_INFO,logmsg);#elsememset(logmsg,0,500);sprintf(logmsg,"%s\tSome event happens, len = %d.\n",getTime(), len);fwrite(logmsg, 1 , sizeof(logmsg),fplog);#endif#ifdef _DEBUGprintf("%s\tSome event happens, len = %d.\n",getTime(), len);#endifevent = (struct inotify_event *)buffer;while (((char *)event - buffer) < len){if (event->mask & IN_ISDIR){strcpy(strbuf, "Direcotory");}else{strcpy(strbuf, "File");}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"\tObject type: %s\n", strbuf);syslog(LOG_INFO,logmsg);#elsememset(logmsg,0,500);sprintf(logmsg,"\tObject type: %s\n", strbuf);fwrite(logmsg, 1 , sizeof(logmsg),fplog);printf("\tObject type: %s\n", strbuf);#endif#endiffor (i=0; i<wd_NUM; i++){if (event->wd != wd_array[i].wd) continue;#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"\tObject name: %s\n", wd_array[i].name);syslog(LOG_INFO,logmsg);#elsememset(logmsg,0,500);sprintf(logmsg,"\tObject name: %s\n", wd_array[i].name);fwrite(logmsg, 1 , sizeof(logmsg),fplog);#ifdef _DEBUGprintf("\tObject name: %s\n", wd_array[i].name);#endif#endifbreak;}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"\tEvent mask: %08X\n", event->mask);syslog(LOG_INFO,logmsg);#elsememset(logmsg,0,500);sprintf(logmsg,"\tEvent mask: %08X\n", event->mask);fwrite(logmsg, 1 , sizeof(logmsg),fplog);printf("\tEvent mask: %08X\n", event->mask);#endif#endiffor (i=0; i<EVENT_NUM; i++){if (event_array[i][0] == '\0') continue;if (event->mask & (1<<i)){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"\tEvent: %s\n", event_array[i]);syslog(LOG_INFO,logmsg);#elsememset(logmsg,0,500);sprintf(logmsg,"\tEvent: %s\n", event_array[i]);fwrite(logmsg, 1 , sizeof(logmsg),fplog);#ifdef _DEBUGprintf("\tEvent: %s\n", event_array[i]);#endif#endif}}tmp_len = sizeof(struct inotify_event) + event->len;event = (struct inotify_event *)(offset + tmp_len);offset += tmp_len;}fflush(fplog);}}#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"\tEsleep time %d\r",sleeptime);syslog(LOG_INFO,logmsg);#elseprintf("sleep time %d\r", sleeptime);fflush(stdout);#endiffflush(stdout);init(m_argc, m_argv);read(fd, buffer, BUF_SIZE);sleep(sleeptime);}return 0;}// read the configure from file.confint readConfig(char * filename){FILE * fp;fp = fopen(filename,"r");if(fp == NULL){memset(logmsg,0,500);sprintf(logmsg,"%s created.\n", filename);syslog(LOG_INFO,logmsg);#elseprintf("No %s exists.\n", filename);printf("%s created.\n", filename);#endifresetConfig(filename);fp = fopen(filename,"r");if(fp == NULL){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s can not read.\n", filename);syslog(LOG_INFO,logmsg);#elseprintf("%s can not read.\n", filename);#endifexit(-1);}}int cur_file = 0;int cur_dir = 0;int cur_type = 0;char *f_dirs[500]; // for record the files//so the max dirs cmd list len is 500 char *fileTypes[500]; // for record the file type// so the max fileType cmd list len is 500 char *f_files[500]; // for record the files// so the max fileType cmd list len is 500 char * p;int i;int rflag = 0;int type = 0;int ret = 0;while(!feof(fp) && type < 4){fgets(buffer,filenameLen, fp);if(buffer[0] == '#'){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d %s",strlen(buffer),buffer);syslog(LOG_INFO,logmsg);#elseprintf("%d %s",strlen(buffer),buffer);fflush(stdout);#endif#endifcontinue;}if(0 == strcmp(buffer, "[DIRECTORY]\n")){type++;fgets(buffer,filenameLen, fp);if(strlen(buffer) > 1)while(!feof(fp) && buffer[0] != '#' && 0!= strcmp(buffer,"[FILE]\n")){#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d %s",strlen(buffer),buffer);syslog(LOG_INFO,logmsg);#elseprintf("%d %s",strlen(buffer),buffer);fflush(stdout);#endif#endifif(strlen(buffer) > 1){int len = strlen(buffer);buffer[len-1]='\0';f_dirs[cur_dir] = (char *) malloc(sizeof(char)*500);strcpy(f_dirs[cur_dir], buffer); // save typecur_dir++;}fgets(buffer,filenameLen, fp);}}else if(0 == strcmp(buffer, "[FILE]\n")){type++;fgets(buffer,filenameLen, fp);if(strlen(buffer) > 1)while(!feof(fp) && buffer[0] != '#' && 0!= strcmp(buffer,"[FILE_TYPE]\n")){#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d %s",strlen(buffer),buffer);syslog(LOG_INFO,logmsg);#elseprintf("%d %s",strlen(buffer),buffer);fflush(stdout);#endif#endifif(strlen(buffer) > 1){int len = strlen(buffer);buffer[len-1]='\0';f_files[cur_file] = (char *) malloc(sizeof(char)*500);strcpy(f_files[cur_file], buffer); // save typecur_file++;}fgets(buffer,filenameLen, fp);}}else if(0 == strcmp(buffer, "[FILE_TYPE]\n")){type++;fgets(buffer,filenameLen, fp);if(strlen(buffer) > 1)while(!feof(fp) && buffer[0] != '#' && 0!= strcmp(buffer,"[Time]\n")){#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d %s",strlen(buffer),buffer);syslog(LOG_INFO,logmsg);#elseprintf("%d %s",strlen(buffer),buffer);fflush(stdout);#endif#endifif(strlen(buffer) > 1){int len = strlen(buffer);buffer[len-1]='\0';fileTypes[cur_type] = (char*)malloc(sizeof(char) * 500);strcpy(fileTypes[cur_type],buffer); // save itcur_type++;}fgets(buffer,filenameLen, fp);}}else if(0 == strcmp(buffer, "[Time]\n")){type++;fgets(buffer,filenameLen, fp);if(strlen(buffer) > 1)while(!feof(fp) && buffer[0] != '#'){#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d %s",strlen(buffer),buffer);syslog(LOG_INFO,logmsg);#elseprintf("%d %s",strlen(buffer),buffer);fflush(stdout);#endif#endifif(strlen(buffer) > 1){int len = strlen(buffer);//buffer[len-1]='\0';sleeptime = atoi(buffer);}fgets(buffer,filenameLen, fp);}}}if(type != 4){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s is broken. Reset the configure....\n", filename);syslog(LOG_INFO,logmsg);resetConfig(filename);memset(logmsg,0,500);sprintf(logmsg,"%s is read again....\n", filename);syslog(LOG_INFO,logmsg);return readConfig(filename);#elseprintf("%s is broken. Reset the configure....\n", filename);resetConfig(filename);printf("%s is read again....\n", filename);return readConfig(filename);#endif}if(cur_dir + cur_file == 0 || (cur_dir ==0 && cur_type != 0)){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s is not configured correctly. Set the configure please.\n", filename);syslog(LOG_INFO,logmsg);#elseprintf("%s is not configured correctly. Set the configure please.\n", filename);#endif//resetConfig(filename);exit(-1);}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d lines read %d types.\n",cur_dir +cur_type + cur_file, cur_type);syslog(LOG_INFO,logmsg);#elseprintf("%d lines read %d types.\n",cur_dir +cur_type + cur_file, cur_type);#endif#endiffclose(fp);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is readConfig function. \n");syslog(LOG_INFO,logmsg);#elseprintf("Here is readConfig function. \n");fflush(stdout);#endif#endif// default is with recursivelyret = execCmd(f_dirs, f_files, fileTypes, cur_dir, cur_file, cur_type, fileScan, 1);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is readConfig function. ret %d\n",ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is readConfig function. ret %d\n",ret);fflush(stdout);#endif#endiffor(i = 0; i < cur_dir; i++){free(f_dirs[i]);}for(i = 0; i < cur_type; i++){free(fileTypes[i]);}return ret;}// reset the file.conf if errorint resetConfig(char * filename){FILE * fp;fp = fopen(filename,"w");if(fp == NULL){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Can not open %s\n", filename);syslog(LOG_INFO,logmsg);#elseprintf("Can not open %s\n", filename);#endifexit(-1);}fputs("#This is the configure file for fileMonitor.\n", fp);fputs("#DO NOT CHANGE the structure of this file.\n", fp);fputs("#In this place you can add the directories to be monitored.\n", fp);fputs("#Be aware that there is no space in front of each line.\n", fp);fputs("#Remmember that PRESS Enter at the end of each line.\n", fp);fputs("#EXAMPLE|/home/tuxe/dir\n", fp);fputs("[DIRECTORY]\n", fp);fputs("/home\n\n", fp);fputs("#In this place you can add the files to be monitored.\n", fp);fputs("#Be aware that there is no space in front of each line.\n", fp);fputs("#Remmember that PRESS Enter at the end of each line.\n", fp);fputs("#EXAMPLE|/home/tuxe/file\n", fp);fputs("[FILE]\n\n", fp);fputs("#In this place you can add file types to be monitored.\n", fp);fputs("#Be aware that there is no space in front of each line.\n", fp);fputs("#Remmember that PRESS Enter at the end of each line.\n", fp);fputs("#EXAMPLE|*.txt\n", fp);fputs("[FILE_TYPE]\n", fp);fputs("*.txt\n\n", fp);fputs("#In this place you can add time option.\n", fp);fputs("#Be aware that there is no space in front of each line.\n", fp);fputs("#Remmember that PRESS Enter at the end of each line.\n", fp);fputs("#EXAMPLE|2\n", fp);fputs("[Time]\n", fp);fputs("1\n\n", fp);fclose(fp);}// parse the cmd and set files// return the wd_NUM;int parseCmd(char * filename, int argc, char **argv){int cmd_num = argc - 1;int offset = 1;// this test is no necessary.if(cmd_num <= 0){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Unknown error.\n");syslog(LOG_INFO,logmsg);#elseprintf("Unknown error.\n");#endifexit(-1);}int cur_file = 0;int cur_dir = 0;int cur_type = 0;char *f_dirs[500]; // for record the files//so the max dirs cmd list len is 500 char *fileTypes[500]; // for record the file type// so the max fileType cmd list len is 500 char *f_files[500]; // for record the files// so the max fileType cmd list len is 500 char * p;int i;char type = 'a';int rflag = 0;for(i = 0; i < cmd_num; i++){p = argv[i + offset];if(0 == strcmp(p, "--help")){printf("Usage:fileMonitor -d dirs -f files [-t fileTypes]\n\--help show help information\n\-f this is to set some files\n example -f /home/file1 /home/n.c\n\-d this is to set some directories\n example -d /home /tmp\n\-t this is optional to set some file_types\n example -t *.txt *.png\n\ -n set the time to monitor the directories\n example -n 2\n\-r to monitor with recursively\n\This program is used for monitor some files coded by Ren Gaojun, China.\n");fflush(stdout);exit(0);}if(0 == strcmp(p, "-f")){type = 'f';continue;}else if(0 == strcmp(p, "-d")){type = 'd';continue;}else if(0 == strcmp(p, "-t")){type = 't';continue;}else if(0 == strcmp(p,"-r")){type = 'a';rflag = 1;continue;}else if(0 == strcmp(p,"-n")){type = 'n';continue;}if( type == 'f'){f_files[cur_file++] = p;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"type f %s \n",p);syslog(LOG_INFO,logmsg);#elseprintf("type f %s \n",p);#endif#endif}else if( type == 'd'){f_dirs[cur_dir++] = p;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"type d %s \n",p);syslog(LOG_INFO,logmsg);#elseprintf("type d %s \n",p);#endif#endif}else if( type == 't'){fileTypes[cur_type++] = p;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"type t %s \n",p);syslog(LOG_INFO,logmsg);#elseprintf("type t %s \n",p);#endif#endif}else if( type == 'n'){sleeptime = atoi(p);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"type n %s \n",p);syslog(LOG_INFO,logmsg);#elseprintf("type n %s \n",p);#endif#endif}}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d cmd_num %d dirs %d files %d types %d rflag.\n",cmd_num,cur_dir, cur_file, cur_type, rflag);syslog(LOG_INFO,logmsg);#elseprintf("%d cmd_num %d dirs %d files %d types %d rflag.\n",cmd_num,cur_dir, cur_file,cur_type, rflag);#endif#endifreturn execCmd(f_dirs,f_files, fileTypes, cur_dir,cur_file, cur_type, filename, rflag);}// execute the command to get the file list with recursively.int execCmd(char** dirs, char** f_files, char** filetypes, int dsize,int fsize, int tsize, char * filename, int flag){int i = 0;int ret = 0;memset(buffer,0,BUF_SIZE);//sprintf(buffer,"find %s -name '%s' > file.scan",argv[1] , argv[2]);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmd function.\n");syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmd function.\n");fflush(stdout);#endif#endifif(tsize > 0) // with filetype{ret = execCmdT(dirs,filetypes,dsize, tsize, filename,0);}if(fsize > 0)ret = execCmdF(f_files,fsize, ret);if(dsize > 0){if(!flag) // not set the recursively flagret = execCmdN(dirs,dsize, filename,ret);elseret = execCmdR(dirs,dsize, filename,ret);}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmd function. ret %d\n", ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmd function. ret %d\n", ret);fflush(stdout);#endif#endifreturn ret;}// with file type.int execCmdT(char** dirs, char** filetypes, int dsize, int tsize, char * filename,int cur){int i =0;int ret = cur;memset(buffer,0,BUF_SIZE);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdT function. dsize %d, tsize %d\n", dsize, tsize);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdT function. dsize %d, tsize %d\n", dsize, tsize);fflush(stdout);#endif#endifstrcpy(buffer,"find ");for(i = 0; i < dsize; i++){strcat(buffer,dirs[i]);strcat(buffer," ");}strcat(buffer,"-name '");char tmp[BUF_SIZE];strcpy(tmp,buffer); // save the buffer.for(i = 0; i < tsize; i++) // each time search one type of file{strcat(buffer,filetypes[i]);strcat(buffer,"' > ");strcat(buffer,filename);system(buffer);#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s\n",buffer);syslog(LOG_INFO,logmsg);#elseprintf("%s\n",buffer);fflush(stdout);#endif#endifret = readScan(filename,ret);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"ret %d %s\n",ret, filename);syslog(LOG_INFO,logmsg);#elseprintf("ret %d %s\n",ret, filename);fflush(stdout);#endif#endifstrcpy(buffer,tmp);}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdT function. ret %d\n", ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdT function. ret %d\n", ret);fflush(stdout);#endif#endifreturn ret;}// execute the command to get the file list with recursively.int execCmdR(char** dirs, int dsize, char * filename,int cur){int i = 0;int ret = cur;memset(buffer,0,BUF_SIZE);#ifdef _DEBUGmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdR function. \n");syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdR function. \n");fflush(stdout);#endif#endifstrcpy(buffer,"find ");for(i = 0; i < dsize; i++){strcat(buffer,dirs[i]);strcat(buffer," ");}// strcat(buffer,"-type d > ");strcat(buffer," > ");strcat(buffer,filename);system(buffer);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s\n",buffer);syslog(LOG_INFO,logmsg);#elseprintf("%s\n",buffer);fflush(stdout);#endif#endifret = readScan(filename,ret);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdR function. ret %d\n", ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdR function. ret %d\n", ret);fflush(stdout);#endif#endifreturn ret;}// execute the filesint execCmdF(char** f_files,int fsize,int cur){int i = 0;int ret = 0;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdF function.\n");syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdF function.\n");fflush(stdout);#endif#endiffor(i = 0; i < fsize; i++){strcpy(files[cur + i], f_files[i]);}ret = fsize + cur;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdF function. ret %d\n", ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdF function. ret %d\n", ret);fflush(stdout);#endif#endifreturn ret;}// execute the command to get the file list with no recursively.// just monitor the directory no filetypeint execCmdN(char** dirs,int dsize, char * filename,int cur){int i = 0;int ret = cur;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdN function.\n");syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdN function.\n");fflush(stdout);#endif#endiffor(i = cur; i < dsize + cur; i++){strcpy(files[i], dirs[i-cur]);}ret = i;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdN function. ret %d\n", ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdN function. ret %d\n", ret);fflush(stdout);#endif#endifreturn ret;}int readScan(char * filename, int cur){int num = cur;FILE * fp;fp = fopen(filename,"r");if(fp == NULL){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Fail to open %s.\n", filename);syslog(LOG_INFO,logmsg);#endifprintf("Fail to open %s.\n", filename);exit(-1);}while(num < filelistLen && !feof(fp)) // read files and save them.{int L;fgets(files[num],filenameLen,fp);。
操作系统实验2

}
int mgsid;
if((mgsid=msgget(key,IPC_CREAT|0666))== -1)
{
printf("creat error\n");
return -1;
}
pid1=fork();
if(pid1<0)
{
printf("fork creat error!\n");
3.子进程p2通过管道读取消息,如果消息是“ok”,则打开文件,读取文件内容,并将其输出到屏幕上,关闭文件.
消息队列--实验内容
父进程创建消息队列和两个子进程p1和p2
子进程p1打开给定文件(如果没有,则创建文件),并向文件中写数据,写完关闭文件,然后向消息队列写入一条消息“ok”,目的是通知进程p2可以读取文件内容了。
char readbuffer[80];
pipe(fd);
int r_fd = fd[0];
int w_fd = fd[1];
if((childpid1 = fork())== -1)
{ perror("fork error!");
exit(1); }
else if(childpid1 == 0)
{
{
printf("The file %s not open\n","hello.txt");
return;
}
fputs("Hello!",fp);
fclose(fp);
strcpy(msg1.data,"ok");
if(msgsnd(mgsid,&msg1,sizeof(msg1.data),0)<0){
操作系统实验报告通用(两篇)2024

操作系统实验报告通用引言:操作系统是计算机系统中的一个重要组成部分,它主要负责管理计算机硬件和软件资源,并为用户提供一个友好的界面。
操作系统实验是计算机科学与技术专业的一门重要实践课程,通过实际操作和实验验证,可以深入理解操作系统的工作原理和实现方法。
本文将以《操作系统实验报告通用》为题,从引言概述、正文内容、总结等方面详细阐述操作系统实验的一般结构和内容。
概述:操作系统实验是计算机科学与技术专业的一门实践课程,通过实际操作和实验验证来了解操作系统的工作原理和实现方法。
在操作系统实验中,学生将学习操作系统的基本概念、运行机制和实现技术,并通过实验验证来加深对操作系统的理解。
操作系统实验通常涉及到操作系统的各个模块,如进程管理、文件系统、内存管理等,并通过实际操作来了解操作系统的具体实现。
操作系统实验通常包括实验报告、实验代码以及实验总结等部分。
正文内容:1. 实验背景和目的1.1 实验背景在操作系统实验中,学生将学习操作系统的基本概念、运行机制和实现技术,通过实验来了解操作系统的具体实现和应用。
1.2 实验目的操作系统实验的主要目的是通过实际操作和实验验证来加深对操作系统的理解,并培养学生的动手能力和解决问题的能力。
2. 实验内容2.1 实验一:进程管理进程管理是操作系统中的核心模块之一,它负责管理和调度系统中的进程。
在这个实验中,学生需实现一个简单的进程管理器,并能够模拟多个进程的并发执行和互斥访问。
2.2 实验二:文件系统文件系统是操作系统中的另一个重要模块,它负责管理和组织计算机中的文件和目录。
在这个实验中,学生需实现一个简单的文件系统,并能够进行文件的创建、打开、读写和关闭操作。
2.3 实验三:内存管理内存管理是操作系统中的关键模块之一,它负责管理系统中的内存资源。
在这个实验中,学生需实现一个简单的内存管理器,并能够进行内存的分配和释放操作。
2.4 实验四:设备管理设备管理是操作系统中的另一个重要模块,它负责管理和调度计算机中的各种设备。
天津理工大学 数据库实验二

实验报告学院(系)名称:计算机与通信工程学院【实验过程记录(源程序、测试用例、测试结果及心得体会等)】(1)将学习了数据库课程的学生成绩加5分。
update SC set Grade=Grade+5 where Cno=(select Cno from Course where Cname =N'数据库')(2) 将计算机系学习了2号课程的学生成绩置0。
update SC set Grade=0 whereSno in(select Sno from Student where Sdept='CS')and Cno=2(3) 将李勇的数据库成绩改为85。
update SC set Grade=85 where Sno=(select Sno from Student where Sname=N'李勇')and Cno=(select Cno from Course where Cname=N'数据库')(4) 将选修了2号课程且成绩为空的选课记录删除。
delete from SC where Cno= 2 and Grade= 0(5) 从课程表中删除在选课表中没有选课记录的课程记录。
delete from Course where Cno not in(select Cno from SC)(6) 删除计算机系学生选修了数据库课程的选课记录。
delete from SC where Sno in(select Sno from Student where Sdept='CS') and Cno=(select Cno from Course where Cname=N'数据库')(7) 求各系的系名及男女生人数并将结果保存到另一个表中。
create view Dept(Sdept,Ssex,num)as select Sdept,Ssex,COUNT(Ssex)from Student group by Sdept,Ssex(8) 将平均成绩80分以上的学生的学号,选学的课程数和平均成绩保存到另一个表中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1页 共8页 实验报告 学院(系)名称:计算机与通信工程学院 姓名 学号 专业 计算机科学与技术(中加)
班级 2011级1班 实验项目 实验二:存储器的分配与回收算法实现 课程名称 操作系统 课程代码 0668036
实验时间 2013-12-06 1-2节 2013-12-10 7-8节 2013-12-13 1-2节 2013-12-17 7-8节 实验地点 主校区7-216、219 主校区7-216、215 主校区7-216、219 主校区7-220、219
批改意见 成绩
教师签字: 实验内容: 1. 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。 2. 采用最先适应法、最佳适应法、最坏适应法分配主存空间。 3. 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。 4. 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。 5. 设计的模拟系统中,进程数不小于5,进程调度方式可以采用实验一中的任何一种。 6. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。
实验要求: 1. 详细描述实验设计思想、程序结构及各模块设计思路; 2. 详细描述程序所用数据结构及算法; 3. 明确给出测试用例和实验结果; 4. 为增加程序可读性,在程序中进行适当注释说明; 5. 认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等; 6. 实验报告撰写要求结构清晰、描述准确逻辑性强; 7. 实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。 第2页 共8页
【实验过程记录(源程序、测试用例、测试结果及心得体会等)】 #include int work[10][2]; int idle[10][2]; int free[10][3]; int num=0,b=1,d,ch1,ch2; void init(){ idle[0][0]=1;idle[0][1]=100;
free[0][0]=0;free[1][1]=0;free[1][2]=0; work[0][0]=0;work[0][1]=0; for(int i=1;i <=9;i++){ idle[i][0]=0;idle[i][1]=0; free[i][0]=0;free[i][1]=0;free[i][2]=0; work[i][0]=0;work[i][1]=0; } } void jishu(){ for(int i=0;i <9;i++) if(idle[i][1]!=0) num++; } void jishu1(){ for(int i=0;i <9;i++) if(work[i][1]!=0) b++; }
void zuixian(){ jishu(); for(int i=0;i for(int j=i;j if(idle[j][0]>idle[j+1][0]){ int temp=idle[j][0]; idle[j][0]=idle[j+1][0]; idle[j+1][0]=temp; temp=idle[j][1]; idle[j][1]=idle[j+1][1]; 第3页 共8页
idle[j+1][1]=temp; } } } }
void zuijia(){ num=0; jishu(); for(int i=0;i for(int j=i;j if(idle[j][1]>idle[j+1][1]){ int temp=idle[j][0]; idle[j][0]=idle[j+1][0]; idle[j+1][0]=temp; temp=idle[j][1]; idle[j][1]=idle[j+1][1]; idle[j+1][1]=temp; } } } }
void zuihuai(){ num=0; jishu(); for(int i=0;i for(int j=i;j if(idle[j][1] int temp=idle[j][0]; idle[j][0]=idle[j+1][0]; idle[j+1][0]=temp; temp=idle[j][1]; idle[j][1]=idle[j+1][1]; idle[j+1][1]=temp; } } } } void huishou(int name){ num=0; b=0; jishu(); jishu1(); int c=-1; 第4页 共8页
for(int k=0;k <=b;k++){ if(free[k][0]==name){ c=k; break; }
} if(c==-1)cout <<"要回收的作业不存在!" for(int i=0;i for(int j=i;j if(idle[j][0]>idle[j+1][0]){ int temp=idle[j][0]; idle[j][0]=idle[j+1][0]; idle[j+1][0]=temp; temp=idle[j][1]; idle[j][1]=idle[j+1][1]; idle[j+1][1]=temp; } } } for(int q=0;q if(free[c][1] <=idle[q][0]){ for(int j=num;j>=q;j--){ idle[j+1][0]=idle[j][0]; idle[j+1][1]=idle[j][1]; } idle[j][0]=free[c][1]; idle[j][1]=free[c][2]; b++; if(idle[j+1][0]==idle[j][0]+idle[j][1]){ idle[j][1]=idle[j][1]+idle[j+1][1]; for(int m=j+1;m <=num;m++){ idle[m][0]=idle[m+1][0]; idle[m][1]=idle[m+1][1]; } idle[m][0]=0; idle[m][1]=0; b--; } if(idle[j-1][0]==idle[j][0]){ 第5页 共8页 idle[j-1][1]=idle[j-1][1]+idle[j][1]; for(int n=j;j <=num;j++){ idle[n][0]=idle[n+1][0]; idle[n][1]=idle[n+1][1]; } idle[n][0]=0; idle[n][1]=0; b--; } break; } } if(ch2==1)zuixian(); if(ch2==2)zuijia(); if(ch2==3)zuihuai(); for(int p=c;c free[c][0]=free[c+1][0]; free[c][1]=free[c+1][1]; free[c][2]=free[c+1][2]; work[c][0]=work[c+1][0]; work[c][1]=work[c+1][1]; } cout<<"该进程已被成功回收!"<} } void fp(){ int tag=0; num=0; b=0; jishu(); jishu1(); for(int j=0;j if(work[b][1] free[b][0]=work[b][0]; free[b][1]=idle[j][0]; free[b][2]=work[b][1]; idle[j][0]=idle[j][0]+work[b][1]; idle[j][1]=idle[j][1]-work[b][1]; tag=1; break; } else if(work[b][1]==idle[j][1]){ free[b][0]=work[b][0]; free[b][1]=idle[j][0]; 第6页 共8页 free[b][2]=work[b][1]; tag=1; for(int i=j;i <=num-1;i++){ idle[i][0]=idle[i+1][0]; idle[i][1]=idle[i+1][1]; } break; } else tag=0; } if(tag==0)cout <<"作业过大没有足够存储空间!" <} void print(){ num=0; b=1; jishu(); jishu1(); cout <<"已分配表为:" void main(){ init(); int n; cout <<"1.分配空间;2.回收空间;"