操作系统实验报告书
- 格式:doc
- 大小:270.00 KB
- 文档页数:24
浙江大学城市学院实验报告课程名称操作系统原理实验实验项目名称实验三进程的创建和简单控制学生姓名钱晨专业班级软件1302 学号31301378实验成绩指导老师(签名)日期注意:●务请保存好各自的源代码,已备后用。
●完成本实验后,将实验报告上传ftp。
如没有个人文件夹,请按学号_姓名格式建立。
ftp://hujupload:123456@10.66.28.222:2007/upload●文件名为:学号_姓名_实验XX,如30801001_XXXX_实验01一. 实验目的和要求1.掌握进程的概念和进程的状态,对进程有感性的认识;2.掌握进程创建方法;3.认识进程的并发执行,了解进程族之间各种标识及其存在的关系;4.熟悉进程的创建、阻塞、唤醒、撤销等控制方法。
二、实验内容1.了解有关Linux进程的属性和进程的层次结构;2.学习有关Linux的前台和后台进程;3.学习有关Linux命令的顺序执行和并发执行;4.学习有关挂起和终止进程;5.了解并发程序的不可确定性,进行简单并发程序设计。
三、实验步骤(一)Shell下的进程控制1、用ps查看进程。
查看ps命令的帮助文件,尝试不同的参数,并观察结果,记录截图。
2、kill命令使用。
截图说明。
3、pstree命令使用。
截图说明。
(二)Linux简单进程编程每个步骤请运行程序、截图,并解释运行结果,回答实验指导书的问题。
1i、并发进程之间的切换ii2个子进程分别执行一次,然后P1子进程执行一次,接着父进程执行,代表P1进程结束。
P2子进程执行,父进程再执行,代表P2结束。
2、iP1进程先执行,然后P2进程执行,最后父进程执行ii由于函数printf( )在输出字符串时不会被中断,因此,字符串内部字符顺序输出不变iii3、iii Fork每次被重新调用iii 运行一个进程超过计算机的一个时钟周期,被切换ivV后者进程ID不改变4、iii sleep(1)延长进程执行的时间iiiwait() 让父进程等待子进程结束才执行5、#include<unistd.h>#include<stdio.h>#include<sys/types.h>#include<stdlib.h>main(){int p1;int i;while((p1=fork())==-1);if(p1==0){printf("i am the child process,my process id is %d\n",getpid());for(i=0;i<4;i++){sleep(3);system("/bin/ps");}}else{wait();printf("i am the parent process, my process id is %d\n",getpid());}}四、讨论、心得记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。
中南大学计算机操作系统实验报告................................................................................................................................................................................................................1、增强学生对计算机操作系统基本原理、基本理论、基本算法的理解;2、提高和培养学生的动手能力。
1、每人至少选作1 题,多做不限;2、每人单独完成,可以讨论,但每人的设计内容不得彻底相同,抄袭或者有2 人/多人设计彻底一样者,不能通过;3、设计完成后,应上交课程设计文档,文档格式应是学校课程设计的标准格式,所有学生的封面大小、格式也必须一样;4、同时上交设计的软盘(或者以班刻录光盘)。
调度算法的摹拟:摹拟各种调度算法,并进行调度性能分析。
摹拟了一个作业调度算法,其中用到了先来先服务算法(FCFS)、短作业优先算法(SJF)、最高响应比优先算法(HRN)三种算法。
如下,分别为三种算法的程序流程图。
图1 - 开始界面图 2 –输入作业的信息(名字、提交时间、运行时间) 图3 –选择算法(FCFS 、SJF、HRN)图4、5 –选择FCFS 算法后输出结果图6、7 –选择SJF 算法后输出结果图8、9 –选择HRN 算法后输出结果能体现公平性;一旦一个较长的作业进入系统后就会长期的占用系统的资源,这样如果有优先级较高的短作业需要执行的话需要等待很长期。
比前者改善了平均周转时间和平均带权周转时间,缩短作业的等待时间,提高系统的吞吐量;对长作业非常不利,可能长期得不到执行,未能一句作业的紧迫程度来划分执行的优先级,难以准确估计作业的执行时间,从而影响调度性能。
这种算法是对FCFS 方式和SJF 方式的一种综合平衡。
实验报告模板Clear之后2.浏览文件系统:(1)运行pwd命令,确定当前工作目录。
(2)运行ls –l命令,理解各字段含义。
第一部分“-rw-r--r--”表示该文件的权限,即所有者权限为读和写,组用户和其他用户的权限为只读。
第二部分“l”表示该文件是符号链接,第三第四部分所有者和所有者所在的用户组,第五部分的数字表示文件的大小(以字节为单位),剩下的依次是文件创建月日时间和文件名。
(3)运行ls –ai命令,理解各字段含义。
列出的是全部i节点信息(4)使用cd命令,将工作目录改到根(/)上。
运行ls –l命令,了解各目录的作用。
/bin:存放着使用者最经常使用的命令。
如:ls等/boot:存放的是启动Linux时使用的一些核心文件。
/dev:是device的缩写.这个目录下是所有Linux的外部设备例如:/dev/hda代表第一个物理IDE硬盘。
/etc:这个目录用来存放所有的系统管理所需要的配置文件和子目录。
进入后可以看到很多配置文件/home:用户主目录,比如说有个用户叫aa,那他的主目录就是/home/lib:这个目录里存放着系统最基本的动态链接共享库,其作用类似于Windows里的.dll文件。
几乎所有的应用程序都需要用到这些共享库。
/lost+found:这个目录平时是空的,当系统不正常关机后,这里就成了一些无家可归的文件的避难所。
/mnt:这个目录是空的,系统提供这个目录是让用户临时挂载别的文件系统。
/proc:存放和进程有关的信息。
这个目录是一个虚拟的目录,它是系统内存的映射,这个目录的内容不在硬盘上而是在内存里/root:系统管理员,也叫超级权限者的用户主目录/sbin:s就是Super User的意思,也就是说这里存放的是一些系统管理员使用的系统管理程序/tmp:这个目录不用说,一定是用来存放一些临时文件的地方了/usr/X11R6:存放X-Windows的目录/usr/bin:存放着许多应用程序./usr/sbin:给超级用户使用的一些管理程序就放在这./usr/include:Linux下开发和编译应用程序需要的头文件在这里找./usr/local:这是提供给一般用户的/usr目录,在这安装软件最适合/var:通常用来存放一些变化中的东西/var/log:存放系统日志/var/spool:存放一些邮件、新闻、打印队列等(5)直接使用cd,回到哪里了?用pwd验证。
课内实验报告课程名:操作系统任课教师:沈超专业:信息管理与信息系统学号:姓名:二○一六至二○一七年度第一学期南京邮电大学经济与管理学院Process[numberschedul].order=tempcounter;}程序结果截图:二、银行家算法(网上借鉴)银行家算法,当进程提出资源申请时,系统首先检查该进程对资源的申请量是否超过其最大需求量及系统现有的资源能否满足进程需要。
若超过,则报错,若不能满足,则让该进程等待;否则进一步检查把资源分给该进程后系统能否出于安全状态,若安全,则分配,否则置该进程为等待资源状态。
算法实现过程:设进程i 提出请求REQUEST [j] ,则银行家算法按如下规则进行判断。
(1) 如果REQUEST [i] [j]<= NEED[i][j] ,则转(2) ;否则,出错。
(2) 如果REQUEST [i] [j]<= A V AILABLE[i][j] ,则转(3) ;否则,出错。
(3) 系统试探分配资源,修改相关数据:A V AILABLE[j]-=REQUEST[i][j];ALLOCATION[i][j]+=REQUEST[i][j];NEED[i][j]-=REQUEST[i][j];(4) 系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
Check()关键代码:{int k, f, no=0;int work[M],a[M];char finish[M];anquan=1;for(i=0;i<n; i++) finish[i]='F';for(j=0;j<m; j++) work[j]=available[j]; k=n;do{ for (i=0;i<n; i++){if (finish[i]=='F'){ f=1;for (j=0;j<m; j++)if (need[i][j]>work[j]) printf("处于安全状态.");printf("安全序列号:");for (i=0;i<n;i++) printf ("%d ",a[i]); printf("\n");printf("进程");printf(" ");printf(" Max ");rintf(" ");rintf("allocation");printf(" ");printf("need");printf(" ");f=0;if (f==1)//找到还没完成的且需求数小于可提供进程继续运行的{ finish[i]='T';a[no++]=i;//记录安全序列号for (j=0;j<m; j++)work[j]=work[j]+allocation[i][j];//释放该进程已分配的资源available[j] =work[j];}}}k--; }while(k>0);f=1;for (i=0;i<n; i++)//判断有没有进程没完成{ if (finish[i]=='F'){f=0;break; }} if (f==0) {printf("不安全状态!\n");anquan=0;} else {printf("available");printf("\n");for (i=0;i<n; i++){ printf("%2d",i);printf(" ");for(j=0;j<m; j++)printf("%2d",max[i][j]);printf(" ");for(j=0;j<m; j++)printf("%2d",allocation[i][j]);printf(" ");for(j=0;j<m; j++)printf("%2d",need[i][j]);printf(" ");for(j=0;j<m; j++){if(i>0)break;printf("%2d",available[j]);}printf("\n");}}}程序结果截图:三、实验总结:这次上机模拟了进程调度过程和解决了死锁问题,让我对短作业优先调度算法和银行家算法有了比在课堂上更深刻的认识。
第1篇一、实验背景随着移动互联网的快速发展,Android作为全球最流行的移动操作系统,其应用开发领域日益广阔。
为了深入了解Android开发技术,提高编程能力,我们开展了此次大型安卓实验。
本实验旨在通过实际操作,掌握Android开发的基本流程、常用技术以及项目开发经验。
二、实验目的1. 熟悉Android开发环境,包括Android Studio、JDK、Android SDK等。
2. 掌握Android应用开发的基本流程,包括需求分析、设计、编码、测试、发布等。
3. 熟悉Android常用技术,如Activity、Service、BroadcastReceiver、ContentProvider等。
4. 学会使用Android常用开发工具,如AndroidManifest.xml、布局文件、资源文件等。
5. 实践开发一个完整的Android应用,提高项目开发经验。
三、实验内容1. 需求分析我们计划开发一个Android应用,实现以下功能:- 用户注册、登录、个人信息管理。
- 动态发布、浏览、评论新闻。
- 朋友圈功能,包括发布动态、查看好友动态、点赞、评论等。
- 消息通知、好友管理、系统设置等。
2. 设计根据需求分析,我们设计以下功能模块:- 用户模块:负责用户注册、登录、个人信息管理等功能。
- 新闻模块:负责新闻发布、浏览、评论等功能。
- 朋友圈模块:负责发布动态、查看好友动态、点赞、评论等功能。
- 消息通知模块:负责消息通知、好友管理、系统设置等功能。
3. 编码(1)搭建开发环境1. 安装JDK,配置环境变量。
2. 安装Android Studio,创建新项目。
3. 配置Android SDK,下载所需API。
(2)实现功能模块1. 用户模块:- 使用SQLite数据库存储用户信息。
- 实现用户注册、登录、个人信息管理等功能。
2. 新闻模块:- 使用网络请求获取新闻数据。
- 实现新闻浏览、评论等功能。
西安航空职业技术学院课程课程设计说明书设计题目:专业:班级学号:姓名:指导教师:年月日教务处印制西安航空职业技术学院课程设计任务书课题名称:设计内容:技术条件或要求:指导教师(签名):教研室主任(签名):开题日期:年月 12日完成日期:年月 23 日[摘要]随着Internet的日益普及,在网络上学会配置网络服务器,有着非常重要的意义。
综合网络服务器基于LINUX操作系统上,进行服务器与客户端之间的连接,实现服务器为客户端提供服务。
其实训内容包括linux服务器搭建与测试:dhcp(主机IP的动态获取)服务器搭建与应用、dns(域名解析)服务器搭建与应用、ftp(能够实现网络文件传输的上传和下载)服务器搭建与应用、www(能够实现基于域名的虚拟机访问)服务器搭建与应用、网络访问等等。
综合网络服务器的功能强大,操作简单,扩展性强,稳定性高;方便不同操作系统平台之间的移植;网站最大限度地实现易维护性和易操作性。
Linux是一套免费使用和自由传播的操作系统,以其稳定性和灵活性而著称。
完善的内置网络是Linux的一大特点。
Linux为用户提供了完善的、强大的网络功能。
作为一种网络操作系统,它在网络服务器上得到了广泛的应用。
目录一、课程设计目的:........................................................................................ - 5 -二、课程设计的实验环境:............................................................................ - 5 -三、课程设计的方法与步骤:........................................................................ - 5 -1 .认识Linux,安装Red Hat服务器................................ 错误!未定义书签。
实验进程状态转换及其PCB的变化一、程序流程图:二、使用的数据结构及说明:在本实验中,主要用到的数据结构是PCB的结构,其中PCB的数据结构如下:struct PCB{int P_Id; //PCB的ID号char P_Name[10]; //PCB的名称char P_State[10]; //PCB状态int P_Runtime; //PCB的所需要的运行时间int P_Requiry; //PCB所需要的资源要求struct PCB * next ; //PCB块的下一个指针} ;其中,P_Id,和P_Name用来标示一个进程,而P_State用来标示进程的五种状态:Create_state,Ready_state,Block_state,Run_state,Exit_state。
P_Runtime标示要完成一个进程所需要的时间。
P_Requiry标示一个进程的执行所需要的其他条件,当其他的条件满足,则P_Requiry 置1,否则置0。
Struct PCB * next 用来指向同一队列中的下一个PCB块。
三、程序源代码:#include"stdlib.h"#include"stdio.h"#include"string.h"/********** globle structure and viable ******/struct PCB{int P_Id; //PCB的ID号char P_Name[10]; //PCB的名称char P_State[10]; //PCB状态int P_Runtime; //PCB的所需要的运行时间int P_Requiry; //PCB所需要的资源要求struct PCB * next ; //PCB块的下一个指针} ;struct PCB * Create_state; //创建状态struct PCB * Run_state; //运行状态struct PCB * Ready_state; //就绪状态struct PCB * Block_state; //阻塞状态struct PCB * Exit_state; //退出状态int signal4=0; //标示进程4的完成状态int signal5=0; //标示进程5的完成状态void InsertQueue(struct PCB **head,struct PCB *node) /* insert node function */{struct PCB * p,*q;node->next=NULL;if(*head==NULL) //如果队列为空{*head=node;}Else //队列不空{p=*head;q=p->next;while(q!=NULL) //找到最后的元素位置{p=q;q=q->next;}p->next=node; //将节点插入队列}void DeleteQueue(struct PCB **head,struct PCB *node) //撤销进程,从队列中删除元素{struct PCB *p,*q;q=*head;if(*head==NULL||node==NULL) //如果队列为空,返回return ;if(*head==node) //如果要删除的元素是队首元素{*head=(*head)->next;return;}Else //如果不是队列的首元素{while(q->next!=p&&q->next!=NULL)q=q->next;q=p->next;p->next=NULL;}}void Display_Process(struct PCB * node) //打印进程状态的元素函数{printf("\n\nthis process Id is : %d \n",node->P_Id);printf("this process name is : %s \n",node->P_Name);printf("this process state is : on %s \n ",node->P_State);printf("this process Runtime is : %d \n",node->P_Runtime);if(node->P_Requiry)printf("this process resource is ready \n");elseprintf("this process resource is not ready ! \n");}void DispatchToBlock(struct PCB *node) // /* dispatch to block function*/{ //调度到阻塞状态的函数//struct PCB *p=(struct PCB *)malloc(sizeof(struct PCB));if(!node->P_Requiry) //如果所需要的资源没有满足则,调度到阻塞状态{strcpy(node->P_State,"block");InsertQueue(&Block_state,node); //插入到阻塞队列Display_Process(node);}void DispatchToReady(struct PCB *node) // dispatch to ready state{ //调度到就绪状态的函数if(node->P_Requiry) //如果所需的资源满足,则调度{strcpy(node->P_State,"Ready");InsertQueue(&Ready_state,node);Display_Process(node);}}void DispatchBlockToReady() //dispatch the process to readyqueue{ //从阻塞状态调度到就绪状态函数struct PCB*p,*q;q=Block_state;while(q!=NULL) //如果阻塞状态队列不空{p=q;q=q->next;if(signal4&&p->P_Id==4) //如果所需要的资源满足{DeleteQueue(&Block_state,p);strcpy(p->P_State,"ready");InsertQueue(&Ready_state,p);printf("process4 will be in the state of ready!\n");Display_Process(p);}if(signal5&&p->P_Id==5){DeleteQueue(&Block_state,p);strcpy(p->P_State,"ready");InsertQueue(&Ready_state,p);printf("process5 will be in the state of ready!\n");Display_Process(p);}}}void Create_Process() //创建进程函数{int i;struct PCB *p;char name[10];strcpy(name,"process");for(i=1;i<3;i++) //动态创建2个处于阻塞状态的进程{p=(struct PCB *)malloc(sizeof(struct PCB));p->P_Id=i;name[7]=i+'0';name[8]='\0';strcpy(p->P_Name,name);strcpy(p->P_State,"create");p->P_Runtime=1; //所需要的时间片为1p->P_Requiry=0;Display_Process(p);sleep(4);printf(" \n process%d will be in the state of Block, waiting the resource ready \n\n",i);DispatchToBlock(p); //同时调度到阻塞队列}for(i=3;i<7;i++) //创建4个就绪状态的队列{p=(struct PCB *)malloc(sizeof(struct PCB));p->P_Id=i;name[7]=i+'0';name[8]='\0';strcpy(p->P_Name,name);strcpy(p->P_State,"create");p->P_Requiry=1;if(i==6) //在这里个进程6所需要的时间片为2p->P_Runtime=2;elsep->P_Runtime=1;Display_Process(p);sleep(4);printf(" \n process%d will be in the state of Ready, waiting to run \n\n",i);DispatchToReady(p);}}void display(struct PCB **head) //打印各个状态队列里进程数目{struct PCB *p,*q;p=*head;while(p!=NULL){sleep(2);//printf("\n\n///////////////////////////////////\n");printf("\n\nthis process Id is : %d \n",p->P_Id);printf("this process name is : %s \n",p->P_Name);printf("this process state is : on %s \n ",p->P_State);printf("this process Runtime is : %d \n",p->P_Runtime);if(p->P_Requiry)printf("this process resource is ready \n");elseprintf("this process resource is not ready ! \n");p=p->next;}}void Process_Run() //进程运行函数{struct PCB *p,*q;p=Ready_state;q=p;while(p!=NULL) //就绪队列不空则继续执行{if(p->P_Runtime<=0) break; //如果时间片执行完了,则跳出循环strcpy(p->P_State,"running");Display_Process(p);p->P_Runtime=p->P_Runtime-1;sleep(4);if(p->P_Runtime>0) //没有完成,则进入就绪队列{printf("this process is not finished,will be dispatch to the ready queue!!\n");DeleteQueue(&Ready_state,p);strcpy(p->P_State,"ready");InsertQueue(&Ready_state,p);Display_Process(p);}Else //执行完成,则跳出,并发送相应的信息{printf("\n\nProcess%d is finished and will be in the state of exit!\n\n",p->P_Id);if(p->P_Id==4) signal4=1;if(p->P_Id==5) signal5=1;}if(signal4||signal5)DispatchBlockToReady(); //如果资源满足,则将进程调度到就绪队列q=q->next;p=q;}if(q==NULL)printf("\nthere is no process ready!\n STOP Machine!!!\n");}int main(int argc,char * argv[]) //主函数{int i;char c='c'; //界面printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \n");printf("...................................Ding Hai bo\n");printf("......Press s to start the process.......\n");scanf("%c",&c);while(1){if(c=='s')break;scanf("%c",&c);}Create_Process(); //调用创建进程函数printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");printf("\n>>>>>>> Display the Ready queue >>>>>>>>>>>>>>>\n");sleep(5);display(&Ready_state); ////////////////显示就绪队列里的进程printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");printf("\n>>>>>>>> Display the Block queue >>>>>>>>>>>>\n");sleep(5); //显示阻塞队列函数display(&Block_state); /////////////////////printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n\n");printf("\n>>>>>>>> Now the process start to run >>>>>>>>>>>\n");sleep(5);Process_Run(); //调用进程运行函数}四、运行结果及说明:运行结果的截图:下面的运行结果是程序执行的每一步进程调度的显示,从进程的创建到进程的执行,结束,每一步进程调度都有显示。
哈尔滨工业大学(威海)操作系统实验报告说明:本实验报告实验答案,是本人在上实验时的测试数据,由于操作系统实验中后面实验与当时所做实验的计算机的配置有关,因此本实验报的数据仅供参考。
实验1进程的描述与控制Windows 2000编程(实验估计时间:100分钟)1.1 背景知识Windows 2000 可以识别的应用程序包括控制台应用程序、GUI应用程序和服务应用程序。
控制台应用程序可以创建GUI,GUI应用程序可以作为服务来运行,服务也可以向标准的输出流写入数据。
不同类型应用程序间的惟一重要区别是其启动方法。
Windows 2000是以NT技术构建的,它提供了创建控制台应用程序的能力,使用户可以利用标准的C++工具,如iostream库中的cout和cin对象,来创建小型应用程序。
当系统运行时,Windows 2000的服务通常要向系统用户提供所需功能。
服务应用程序类型需要ServiceMail()函数,由服务控制管理器(SCM)加以调用。
SCM是操作系统的集成部分,负责响应系统启动以开始服务、指导用户控制或从另一个服务中来的请求。
其本身负责使应用程序的行为像一个服务,通常,服务登录到特殊的LocalSystem账号下,此账号具有与开发人员创建的服务不同的权限。
当C++编译器创建可执行程序时,编译器将源代码编译成OBJ文件,然后将其与标准库相链接。
产生的EXE文件是装载器指令、机器指令和应用程序的数据的集合。
装载器指令告诉系统从哪里装载机器代码。
另一个装载器指令告诉系统从哪里开始执行进程的主线程。
在进行某些设置后,进入开发者提供的main()、Servicemain()或WinMain()函数的低级入口点。
机器代码中包括控制逻辑,它所做的事包括跳转到Windows API函数,进行计算或向磁盘写入数据等。
Windows允许开发人员将大型应用程序分为较小的、互相有关系的服务模块,即动态链接库(DLL)代码块,在其中包含应用程序所使用的机器代码和应用程序的数据。
《操作系统原理》 实 验 报 告 书
班级: 学号: 姓名: 指导教师:
2013-2014 学年 第 一 学期 2
实验名称: LINUX 用户界面 实验时间: 年 月 日 第 周 星期 一、实验目的 1.熟悉Linux字符操作界面,熟练掌握常用Shell命令。 2.熟悉Linux中文本编辑方法,学会编辑软件vi的使用。 3.了解Linux编绎器gcc的功能,掌握基于Linux平台的C程序开发。
二、实验预习(预备知识的问题及回答) 1.为什么在Linux系统中,诸如光盘、U盘等要先挂载而后才能使用?如何获得U盘的设备名?装载点在文件系统中的位置是什么? 由于文件系统的差异,Linux在默认情况下并不支持软盘,光盘,U盘,所以需要通过装在相应盘片才可以访问其中的数据 装载点是挂载文件系统的目录位置
2.从虚拟机界面退出进入Windows OS界面的操作是 Ctrl+Alt ,从Windows OS界面进入虚拟机界面的方法是 鼠标点击虚拟机界面 。 3.权限的含义是什么?如何使用数字法设定文件的权限? Linux系统中的每个文件和目录都有相应的访问许可权限,访问权限分为只读(r),可写(w)和可执行三种,有三种不同类型的用户可以对文件或者目录进行访问,分别是文件所有者(u),同组用户(g)和其它用户(o)。所有的文件和目录都被创建他们的人所拥有。只要你是这个文件的所有者或者你登陆为用户,你就拥有了改变所有者,群组和其他人权限的权利。 使用数字法改变权限: 命令格式chmod权限数值 文件名 说明 给指定文件赋予数值所规定的权限 在数字设定法中,每种权限设置均可以用数值来代表,其中0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,这些值之和便可以用来设定特定权限。 3
4.什么过滤操作?在Linux中如何实现? 过滤操作:将一个命令的输出作为一个命令的输入Linux实现的命令格式:命令|命令
5.在Linux中挂载u盘并能显示其文档的中文信息,所使用的挂载命令是: Mount/dev/sdal/mnt/usb 。 6.什么是vi? 其三种操作模式的含义是什么?给出三种工作模式间的转换图。 命令模式:vi启动后的默认模式,控制光标的移动,复制删除文字,进入输入模式和末行模式 输入模式:进行文字输入 末行模式:保存文件,退出VI
三、实验内容(包含实验所用命令或相关程序源代码) 1.shell操作命令(给出每题所用的Shell命令或命令结果) (1)创建名为stu1、stu2的2个用户,设置密码分别为student1和student2 ,并将它们设为组group1中的成员。 #groupadd group1 #useradd stu1 –g group1 #su stu1 Spasswd stu1 回车后敲入密码student1 $exit #useradd stud2 –g group1 #su stu2 $passwd stu2 $exit
命令模式 输入模式 末行模式 4
(2)在每个用户的主目录下建立2个目录,分别命名为dir1和dir2。 #su stu1 $cd~ $mkdir dir1 $exit #su stu2 $ cd~ $mkdir dir2 $exit
(3)查找stu1用户主目录、下属各子目录的默认存取权限,并给出结论。 #su stu1 $cd.. $ls-1 用户主目录权限为:drwx--------,即目录的用户可读,写,执行,同组和其它的用户无任何权限 #su stu` $cd~ $ls-1 Dir1目录权限为:drwxr-xr-x,即目录的用户可读,写,执行
(4)调试pwd和cd命令,回答下列关于Linux文件系统中目录的有关问题。 ① 用户主目录的绝对路径如何表示? /home/stu1/home/stu2 ② 根目录如何表示? /root ③.和..分别表示什么目录? 子目录,父目录 ④~表示什么目录? 用户主目录 ⑤当前目录如何表示? Cd~
(5)新建用户stu3,设置其密码为student3,并将其设置为group2中成员。尔后,以stu3登录,在其主目录下建立名为text的目录,在text目录下再建立名为dir1的子目录,并使其成为当前目录。 #groupadd group2 #useradd stu3 –g group2 #su stu3 $passwd 回车后敲入密码 student3 5
$cd~ $mkdir text $mkdir dir1 $cd text/dir1
(6)使用cat>sneakers.txt命令,分析命令行cat sneakers.txt的显示结果。 $ cat>sneakers.txt buy some sneakers then go to the coffee shop then buy some coff ^D $cat sneakers.txt
从键盘中创建一个名为sncakers.txt文件,文件内容为:buy some sncakers Then go to the coffee shop Then buy some coff
(7)使用上题的方法,在dir1目录中建立home.txt文件,其内容为: bring the coffee home take off shoes put on sneakers make some coffee relax!
$cd /home/stu1/dir1 $cat>home.txt Bring the coffee home Take off shoes Put on sneakers Make some coffee Relax! [ctrl+d]
(8)试写出实现下列功能的shell命令: ① 将home.txt文件移至其上级目录中(即text目录下)。 $mv/home.txt ② 将home.txt添加到sneakers.txt尾部形成新的文件saturday.txt。 $cat cneakers.txt>asturday.txt $cat home.txt>>Saturday.txt 6
③ 将text目录树从stu3用户主目录下移至stu2主目录下。 【使用特权用户方法】 su mv/home/stu3/text/home/stu2
【修改目录权限方法】 #cp/home/stu3/text/home/stu2
(9) 试画出上述命令后,用户stu1、stu2和stu3主目录中的目录树(3棵子树)。
2. Linux C程序开发 (1)编写Linux C程序,把一个文件的内容复制到另一个文件中,即实现简单的copy功能。要求:程序输入的第一个参数是源文件,第二个参数是目标文件。 【源程序】 #include
stul dir2 dirl
Saturday.txt
Stu2 Dir2 text dir1 Dir1 Home.txt
Sneakers.txt Saturday.txt Stu3 Dir2 text dir1 Dir1 Home.txt
Sneakers.txt Saturday.txt 7
#include #include #include Int main(int argc,char *argv[]) { FILE *in,*out; Char ch; If(argc!=3) { Printf(“you forgot to enter a filename\n”); Exit(0); } If(in=fopen(argv[1],”r”))==NULL { Printf(“can nit open outfile\n”); Exit(0); } If(out=fopen(argv[2],”w”))==NULL { Prntf(“can not open outfile”); Exit(0); } While(!feof(in))fputc(in),out); Fclose(in); Fclose(out); }
【运行命令】 #gcc –o test copy.c #./test file1.c file2.c
(2)编写Linux C程序,列出stu2主目录中的文件信息,并将其中saturday.txt文件的权限设置为文件所有者可读可写、同组用户只读、其他用户无权限。 【源程序】 #include #include #include #include Int main(int argc,char *argv[]) { DIR *dp; Struct dirent *dirp;