操作系统原理》实验指导书.docx
《操作系统原理》实验指导书.docx》由会员分享,可在线阅读,更多相关《操作系统原理》实验指导书.docx(12页珍藏版)》请在冰豆网上搜索。
操作系统原理》实验指导书
《操作系统原理》实验指导书
1、Linux环境下基本命令的使用
2、进程管理实验
3、命令解释程序的实现
实验一 Linux环境下基本命令的使用
一、实验目的:
(1)掌握Shell命令在Unix或Linux操作系统中的作用。
(2)理解Shell命令的解释和运行机制。
(3)掌握Unix或Linux系统环境下的常用的Shell基本操作命令。
二、实验内容:
(1)查看系统的命令提示符,确定系统使用的Shell程序类型,列出Linux系统常见的Shell种类。
(2)查看当前登录在系统中的用户列表、系统中的用户总数和系统启动时间。
(3)查看当前的日期和时间。
(4)显示当前目录,改变到用户主目录并列出当前目录的内容。
(5)在当前目录下,创建名为“自己姓名(用自己学号代替)”的新目录。
在所创建的目录下创建名为“newfile”的新文件。
(6)在屏幕上显示文件newfile的内容。
(7)删除“自己姓名”中的newfile文件。
(8)当前目录的目录“自己姓名”。
(9)列出所有文件。
三、实验步骤:
1、登录和退出
<1>登录服务器系统:
root(实际的用户名自己设置)。
<2>在login:
后输入用户帐号(第一次进入输入root):
密码:
未知
<3>登录后,输入passwd命令来修改密码。
根据提示输入当前密码,再输入两次新的密码。
<4>输入logout命令或exit命令退出系统。
2、获取帮助信息
命令man提供了系统操作命令的在线帮助。
例如,输入manpasswd可以获取命令passwd的帮助说明;输入manopen可以获取open函数的帮助说明。
按空格键,翻页浏览。
按<:
>,再按q退出帮助。
3、基本操作命令
<1>pwd:
确定你当前的工作目录
<2>ls-al:
显示当前工作目录的内容
<3>mkdir:
建立一个子目录
<4>cd:
转换目录
<5>cat或more:
查看文件内容
<6>cp:
复制文件
<7>rm-i:
删除文件
<8>mv:
重命名文件
<9>find:
查找文件
<10>vi编辑命令新文件
<11>who查看当前登录在系统中的用户列表、系统中的用户总数和系统启动时间。
各个命令的具体使用方法,可以用man命令查看。
4、vi编辑器
vi编辑器是一个小巧但功能强大的程序。
vi编辑器有三种不同的模式:
插入模式——这个模式是通过在命令模式按下“i”键进入的。
命令模式——这是用户输入单键命令的模式。
在其他模式中按下ESC键就可以进入命令模式。
常见的执行删除操作的命令有:
dd删除整个行
#dd按照输入的数字(#),从当前行删除几行
D删除光标位置后面全部内容
dw删除光标所在位置的单词
冒号模式——从命令模式输入一个冒号(:
)就可以进入这个模式。
常见的冒号模式命令有:
:
wq保存且退出编辑器
w保存但不退出
q退出且不保存
q!
强行退出vi,不保存。
help获取帮助
1)在系统提示符($)下输入命令vi和想要编辑(建立)的文件名
vitest.c
2)按键I进入插入模式。
屏幕上看不到字符i,屏幕下方出现--INSERT--字样。
3)输入你的程序:
/*********************************************************************
#include
voidmy_print1(char*);
voidmy_print2(char*);
main()
{
charstring[]=“helloworld”;
my_print1(string);
my_print2(string);
}
voidmy_print1(char*string)
printf(“Thestringis%s\n”,string);
voidmy_print2(char*string)
char*string2;
intsize,i;
size=strlen(string);
string2=(char*)malloc(size+1);
for(i=0;i{string2[size–i]=string[i];}string2[size+1]=‘\0’;printf(“Thestringprintedbackwardis%s\n”,string2);}4)按〈Esc〉键,从插入模式进入冒号模式。5)输入wq,保存退出四、实验报告要求:1.记录输入LINUX相关命令后系统输出。2.使用过程出现的问题及解决方法实验二:进程管理实验一、实验目的:(1)了解有关Linux系统调用。(2)学习有关Linux的进程创建,理解进程创建后两个并发进程的执行。(3)加深对进程概念的理解,明确进程和程序的区别。二、实验内容(1)进程的创建。在Linux环境下,编写一个程序使用系统调用fork()创建2个子进程。当此子进程运行时,在系统中由一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符;父进程显示字符’x’,子进程分别显示’y’和’z’。试记录屏幕上的显示结果,并分析原因。(2)进程的管道通信。编写一个程序使用系统调用fork生成3个子进程,并使用系统调用pipe创建一个管道,使得这3个子进程和父进程公用同一管道进行信息通信要求该程序实现数据的输入、输出以及信息提示(3)加深对进程概念的理解,明确进程和程序的区别。三、实验提示:(一)、Linux的系统调用1.进程控制的系统调用1)fork系统调用创建新的子进程格式:pid=intfork()fork调用返回时,系统中已有两个用户级环境完全相同的进程存在,这两个进程从fork调用中得到的返回值不同,其中子进程得到的返回值为零,父进程得到的返回值是新创建子进程的进程标识号。2)exec系统调用格式:intexecl(path,arg0,arg1,…,argn,(char*)0)char*path,*arg0,*arg1,…,*argn;exec调用进程的正文段被指定的目标文件的正文段所覆盖,其属性的变化方式与fork成功后从父进程那里继承属性的方式几乎是一样的。系统中绝大多数命令都是通过exec来执行的,不但shell进程所创建的子进程使用它来执行用户命令,shell进程本身和它的祖先进程也是用exec来启动执行的。3)exit系统调用终止进程执行格式:voidexit(status);intstatus;参数status是调用进程终止时传递给其父进程的值。如调用进程还有子进程,则将其所有子进程的父进程改为1号进程。4)wait系统调用等待子进程暂仃或终止格式:intwait(stat_loc)intwait((int*)0)intstat_loc;wait调用将调用进程挂起,直到该进程收到一个被其捕获的信号或者它的任何一个子进程暂仃或终止为止。如果wait调用之前已有子进程暂仃或终止,则该调用立即返回。5)lockf锁定文件格式:intlockf(fd,fuction,size)intfiles,fuction;longsize;fd–锁定文件标识function=0表示不锁定;function=1(锁定);function=2(测试和锁定);function=3测试有否被锁定size--锁定或解锁的字节数,0表示从文件的当前位置到文件尾。(二)、进程创建程序#includevoidmain(intargc,char*argv[]){intpid;pid=fork();/*forkchildprocess*/if(pid<0){fprintf(stderr,“ForkFailed”);exit(-1);}elseif(pid==0)/*childprocess*/{execlp(“/bin/ls”,”ls”,NULL);}else/*进入父进程*/{wait(NULL);printf(“childComplete”);exit(0);}}(三)、进程通信的系统调用函数实例1)pipe系统调用格式:intpipe(filedes)intfiledes[2];管道通信程序#include#includecharparent[]={“Amessagefromparent.”};charchild[]={“Amessagefromchild.”};main(){intchan1[2],chan2[2];charbuf[100];if(pipe(chan1)==-1||pipe(chan2)==-1)errexit(“pipe”);if(fork()){close(chan1[0]);close(chan2[1]);write(chan1[1],parent,sizeofparent);close(chan1[1]);read(chan2[0],buf,100);printf(“parentprocess:%s\n”,buf);close(chan2[0]);}else{close(chan1[1]);close(chan2[0]);read(chan1[0],buf,100);printf(“childprocess:%s\n”,buf);write(chan2[1],child,sizeofchild);close(chan2[1]);close(chan1[0]);}}四、程序实现1、进程的创建2、进程间通信的实现五、实验报告要求1.记录输入LINUX相关命令后系统输出。2.记录C程序,进行编译运行和调试。3.分析运行结果。4.体会实验三 综合上机-命令解释程序的实现一、实验目的:实现一个简单的命令解释程序,掌握操作系统命令解释程序的实现原理。二、实验内容:编写C程序parse来完成一个简单的命令解释程序,能够支持以下四个命令:quit、disp、list、changedir。三、实验要求:(1)parse应提供一个命令提示符,如parse>,表示接收用户的输入,每次执行完成后再打印下一个命令提示符parse>。当用户没有输入时,parse需要一直处于随时等待输入状态,同时再屏幕上显示一些必要的信息。(2)如果用户提交了一个内部命令,parse应当按照下面的描述执行相应动作。●quit:结束所有的子进程并退出parse.●disp:显示命令行后的所有字符。●list:列出当前目录下的所有文件。●changedir:改变当前目录到所输入目录。(3)分析用户输入1)分析用户输入的语法分析器应具有下面介绍的功能,它能够检查用户的输入错误。如用户输入的某些地方出错了,parse应提供合理的出错信息。2)就像shell一样,parse每次接受用户输入的一行命令,在用户按下回车键(Enter)后开始执行分析动作。四、实验环境本实验的程序用C语言编写,使用makefile文件编译整个程序,生成一个名为parse可执行程序,在终端输入“/parse”即可执行。makefile文件的内容如下:parse:parse.cccparse.c–oparse五、流程图六、程序实现●quit:退出parse程序的执行.●disp:显示命令行后的所有字符。●list:列出当前目录下的所有文件。●changedir:改变当前目录到所输入目录。#include"stdio.h"#include"string.h"#include"unistd.h"charreal_cmd[200],reference[200];get_cmd(charcmd[200]){inti=0,j=0,k=0;real_cmd[0]='\0';reference[0]='\0';while(cmd[i]!='\0'&&cmd[i]=''i++;while(cmd[i]!='\0'&&cmd[i]!=''real_cmd[j++]=cmd[i++];real_cmd[j]='\0';if(cmd[i]!='\0')strcpy(reference,cmd+i+1);}main(){charcmd[200];intquit=0,ch=0,cmd_len,c[10];while(quit==0){printf(">");fgets(cmd,200,stdin);cmd[strlen(cmd)-1]='\0';get_cmd[cmd];if(real_cmd[0]=='\0'continue;printf("inputcommand:[%s][%s]\n",real_cmd,reference);if(strcmp(real_cmd,"list")==0){sprintf(cmd,"ls%s",reference);system(cmd);}elseif()quit=1;elseif(strcmp(real_cmd,"changedir")==0)if(reference!=NULL){if(chdir(reference)<0)printf("changedir:%sErrorfileordirectory!\n",reference);}elseif(strcmp(read_cmd,"disp")==0)();elseif(strcmp(real_cmd,"pwd")==0)system("pwd");elseprintf("unknowncommand\n");}}七、实验报告要求1.记录输入LINUX相关命令后系统输出。2.记录C程序,进行编译运行和调试。3.分析运行结果。4.体会(本资料素材和资料部分来自网络,仅供参考。请预览后才下载,期待您的好评与关注!)
string2[size–i]=string[i];
string2[size+1]=‘\0’;
printf(“Thestringprintedbackwardis%s\n”,string2);
4)按〈Esc〉键,从插入模式进入冒号模式。
5)输入wq,保存退出
四、实验报告要求:
1.记录输入LINUX相关命令后系统输出。
2.使用过程出现的问题及解决方法
实验二:
进程管理实验
(1)了解有关Linux系统调用。
(2)学习有关Linux的进程创建,理解进程创建后两个并发进程的执行。
(3)加深对进程概念的理解,明确进程和程序的区别。
二、实验内容
(1)进程的创建。
在Linux环境下,编写一个程序使用系统调用fork()创建2个子进程。
当此子进程运行时,在系统中由一个父进程和两个子进程活动。
让每个进程在屏幕上显示一个字符;父进程显示字符’x’,子进程分别显示’y’和’z’。
试记录屏幕上的显示结果,并分析原因。
(2)进程的管道通信。
编写一个程序使用系统调用fork生成3个子进程,并使用系统调用pipe创建一个管道,使得这3个子进程和父进程公用同一管道进行信息通信要求该程序实现数据的输入、输出以及信息提示
三、实验提示:
(一)、Linux的系统调用
1.进程控制的系统调用
1)fork系统调用创建新的子进程
格式:
pid=intfork()
fork调用返回时,系统中已有两个用户级环境完全相同的进程存在,这两个进程从fork调用中得到的返回值不同,其中子进程得到的返回值为零,父进程得到的返回值是新创建子进程的进程标识号。
2)exec系统调用
intexecl(path,arg0,arg1,…,argn,(char*)0)
char*path,*arg0,*arg1,…,*argn;
exec调用进程的正文段被指定的目标文件的正文段所覆盖,其属性的变化方式与fork成功后从父进程那里继承属性的方式几乎是一样的。
系统中绝大多数命令都是通过exec来执行的,不但shell进程所创建的子进程使用它来执行用户命令,shell进程本身和它的祖先进程也是用exec来启动执行的。
3)exit系统调用终止进程执行
voidexit(status);intstatus;
参数status是调用进程终止时传递给其父进程的值。
如调用进程还有子进程,则将其所有子进程的父进程改为1号进程。
4)wait系统调用等待子进程暂仃或终止
intwait(stat_loc)intwait((int*)0)
intstat_loc;
wait调用将调用进程挂起,直到该进程收到一个被其捕获的信号或者它的任何一个子进程暂仃或终止为止。
如果wait调用之前已有子进程暂仃或终止,则该调用立即返回。
5)lockf锁定文件
intlockf(fd,fuction,size)
intfiles,fuction;longsize;fd–锁定文件标识
function=0表示不锁定;function=1(锁定);function=2(测试和锁定);
function=3测试有否被锁定
size--锁定或解锁的字节数,0表示从文件的当前位置到文件尾。
(二)、进程创建程序
#include
voidmain(intargc,char*argv[])
{intpid;
pid=fork();/*forkchildprocess*/
if(pid<0)
{fprintf(stderr,“ForkFailed”);exit(-1);}
else
if(pid==0)/*childprocess*/
{execlp(“/bin/ls”,”ls”,NULL);}
else/*进入父进程*/
wait(NULL);
printf(“childComplete”);
exit(0);
(三)、进程通信的系统调用函数实例
1)pipe系统调用
intpipe(filedes)
intfiledes[2];
管道通信程序
charparent[]={“Amessagefromparent.”};
charchild[]={“Amessagefromchild.”};
intchan1[2],chan2[2];
charbuf[100];
if(pipe(chan1)==-1||pipe(chan2)==-1)errexit(“pipe”);
if(fork())
close(chan1[0]);close(chan2[1]);
write(chan1[1],parent,sizeofparent);
close(chan1[1]);
read(chan2[0],buf,100);
printf(“parentprocess:
%s\n”,buf);
close(chan2[0]);
close(chan1[1]);close(chan2[0]);
read(chan1[0],buf,100);
printf(“childprocess:
write(chan2[1],child,sizeofchild);
close(chan2[1]);close(chan1[0]);
四、程序实现
1、进程的创建
2、进程间通信的实现
五、实验报告要求
2.记录C程序,进行编译运行和调试。
3.分析运行结果。
4.体会
实验三 综合上机-命令解释程序的实现
实现一个简单的命令解释程序,掌握操作系统命令解释程序的实现原理。
编写C程序parse来完成一个简单的命令解释程序,能够支持以下四个命令:
quit、disp、list、changedir。
三、实验要求:
(1)parse应提供一个命令提示符,如parse>,表示接收用户的输入,每次执行完成后再打印下一个命令提示符parse>。
当用户没有输入时,parse需要一直处于随时等待输入状态,同时再屏幕上显示一些必要的信息。
(2)如果用户提交了一个内部命令,parse应当按照下面的描述执行相应动作。
●quit:
结束所有的子进程并退出parse.
●disp:
显示命令行后的所有字符。
●list:
列出当前目录下的所有文件。
●changedir:
改变当前目录到所输入目录。
(3)分析用户输入
1)分析用户输入的语法分析器应具有下面介绍的功能,它能够检查用户的输入错误。
如用户输入的某些地方出错了,parse应提供合理的出错信息。
2)就像shell一样,parse每次接受用户输入的一行命令,在用户按下回车键(Enter)后开始执行分析动作。
四、实验环境
本实验的程序用C语言编写,使用makefile文件编译整个程序,生成一个名为parse可执
行程序,在终端输入“/parse”即可执行。
makefile文件的内容如下:
parse:
parse.c
ccparse.c–oparse
五、流程图
六、程序实现
退出parse程序的执行.
#include"stdio.h"
#include"string.h"
#include"unistd.h"
charreal_cmd[200],reference[200];
get_cmd(charcmd[200])
inti=0,j=0,k=0;
real_cmd[0]='\0';
reference[0]='\0';
while(cmd[i]!
='\0'&&cmd[i]=''
i++;
='\0'&&cmd[i]!
=''
real_cmd[j++]=cmd[i++];
real_cmd[j]='\0';
if(cmd[i]!
='\0')
strcpy(reference,cmd+i+1);
charcmd[200];
intquit=0,ch=0,cmd_len,c[10];
while(quit==0)
{printf(">");
fgets(cmd,200,stdin);
cmd[strlen(cmd)-1]='\0';
get_cmd[cmd];
if(real_cmd[0]=='\0'
continue;
printf("inputcommand:
[%s][%s]\n",real_cmd,reference);
if(strcmp(real_cmd,"list")==0)
{sprintf(cmd,"ls%s",reference);
system(cmd);
if()
quit=1;
if(strcmp(real_cmd,"changedir")==0)
if(reference!
=NULL)
{if(chdir(reference)<0)
printf("changedir:
%sErrorfileordirectory!
\n",reference);
if(strcmp(read_cmd,"disp")==0)
();
if(strcmp(real_cmd,"pwd")==0)
system("pwd");
printf("unknowncommand\n");
七、实验报告要求
(本资料素材和资料部分来自网络,仅供参考。
请预览后才下载,期待您的好评与关注!
)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1