操作系统实验报告.docx

上传人:b****5 文档编号:7424002 上传时间:2023-01-23 格式:DOCX 页数:39 大小:476.63KB
下载 相关 举报
操作系统实验报告.docx_第1页
第1页 / 共39页
操作系统实验报告.docx_第2页
第2页 / 共39页
操作系统实验报告.docx_第3页
第3页 / 共39页
操作系统实验报告.docx_第4页
第4页 / 共39页
操作系统实验报告.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

操作系统实验报告.docx

《操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告.docx(39页珍藏版)》请在冰豆网上搜索。

操作系统实验报告.docx

操作系统实验报告

年级

专业

计算机科学与技术

班级

组号

实验室

日期

 

实验

名称

操作系统实验

分项内容

实验级别

实验一操作系统实验环境熟悉(Linux操作命令、Linux/Windows平台编程工具)

实验二进程控制

实验三进程同步与通信管理

实验四虚拟内存管理

实验五文件系统与磁盘管理

小组成员

姓名

学号

组内分工

自我评分

教师评分

实验1,4

 10

 10

实验3,4

 10

 10

实验4,5

 10

 

教师签名:

年月日

实验分项1

 

 操作系统实验环境熟悉(Linux操作命令、Linux/Windows平台编程工具)

熟悉操作系统实验环境

具体题目:

 Linux常用命令的使用(操作系统使用级)

Linux系统基本操作(启动与退出、文件和目录操作、文档备份与压缩、联机帮助等)

Vi/Emacs等编辑软件的使用(操作系统使用级)

cc、gcc、g++、gdb命令的使用(开发调试环境)(操作系统使用级)

系统平台:

Linux

login

1.作用

login的作用是登录系统,它的使用权限是所有用户。

2.格式

login[name][-p][-h主机名称]

3.主要参数

-p:

通知login保持现在的环境参数。

-h:

用来向远程登录的之间传输用户名。

mkdir [options] 目录名 

3.[options]主要参数 

-m, --mode=模式:

设定权限<模式>,与chmod类似。

 

-p, --parents:

需要时创建上层目录;如果目录早已存在,则不当作错误。

 

-v, --verbose:

每次创建新目录都显示信息。

 

--version:

显示版本信息后离开。

 

$ mkdir -m 777 tsk 

grep 

1.作用 

grep命令可以指定文件中搜索特定的内容,并将含有这些内容的行标准输出。

grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

 

2.格式 

grep [options] 

dd 

1.作用 

dd命令用来复制文件,并根据参数将数据转换和格式化。

 

2.格式 

dd [options] 

find命令的作用是在目录中搜索文件,它的使用权限是所有用户。

 

2.格式 

find [path][options][expression] 

path指定目录路径,系统从这里开始沿着目录树向下查找文件。

它是一个路径列表,相互用空格分离,如果不写path,那么默认为当前目录。

 

find命令查找文件的几种方法:

 

(1)根据文件名查找 

例如,我们想要查找一个文件名是lilo.conf的文件,可以使用如下命令:

 

find / -name lilo.conf 

find命令后的“/”表示搜索整个硬盘。

 

(3)根据部分文件名查找方法 

find / -name '*abvd*' 

(4) 使用混合查找方式查找文件  

find /etc -size +500000c -and -mtime +1 

mv 

1.作用 

mv命令用来为文件或目录改名,或者将文件由一个目录移入另一个目录中,它的使用权限是所有用户。

该命令如同DOS命令中的ren和move的组合。

 

2.格式 

mv[options] 源文件或目录 目标文件或目录 

3.[options]主要参数 

-i:

交互方式操作。

如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答“y”或“n”,这样可以避免误覆盖文件。

 

-f:

禁止交互操作。

mv操作要覆盖某个已有的目标文件时不给任何指示,指定此参数后i参数将不再起作用。

 

4.应用实例 

(1)将/usr/cbu中的所有文件移到当前目录(用“.”表示)中:

 

$ mv /usr/cbu/ * . 

(2)将文件cjh.txt重命名为wjz.txt:

 

$ mv cjh.txt wjz.txt  

ls 

1.作用 

ls命令用于显示目录内容,类似DOS下的dir命令,它的使用权限是所有用户。

 

2.格式 

ls [options][filename] 

Diff

命令用于两个文件之间的比较,并指出两者的不同,它的使用权限是所有用户。

 

cmp 

1.作用 

cmp

(“compare”的缩写)命令用来简要指出两个文件是否存在差异,它的使用权限是所有用户。

 

2.格式 

cmp[options] 文件名 

3.[options]主要参数 

cat 

1.作用 

cat(“concatenate”的缩写)命令用于连接并显示指定的一个和多个文件的有关信息,它的使用权限是所有用户。

 

2.格式 

cat [options] 文件1 文件2…… 

3.[options]主要参数 

-n:

由第一行开始对所有输出的行数编号。

 

-b:

和-n相似,只不过对于空白行不编号。

 

-s:

当遇到有连续两行以上的空白行时,就代换为一行的空白行。

  

$ cat -b /etc/named.conf 

ln 

1.作用 

ln命令用来在文件之间创建链接,它的使用权限是所有用户。

 

2.格式 

ln [options] 源文件 [链接名] 

 

部分实验截图如下:

通过本次试验熟悉了linux下的常用的命令,了解了基本的shell命令的用法和作用,能够在linux下操作文件,目录。

了解了VI的基本命令,插入,粘贴,复制等命令。

了解了linux下文件目录的基本结构,文件的属性,用户的属性,能够较熟练的操作图形界面。

总之算是对linux有个基本的了解。

实验分项2

 

 实验二进程控制

 熟悉linux和windows下进程的管理,包括创建,睡眠,销毁等。

具体题目

1Linux系统常用进程管理命令的使用(操作系统观察级)

2Linux系统常用进程创建与管理的系统调用(原码阅读与系统编程级)

3Windows平台常用进线程控制API(原码阅读与系统编程级)

系统平台

LinuxWindows

 

1.exec系列系统调用

exec系统调用(实际上是一系列系统调用)可以将二进制文件的程序映像载入内存,替换原来进程的地址空间,并开始运行它。

#include

intexecl(constchar*path,constchar*arg,…)

对execl()的调用会将path所指路径的映像载入内存,替换当前进程的映像。

注意:

参数列表必须以NULL结尾

2.fork()系统调用

fork()系统调用可以创建一个和当前进程映像一样的进程。

#include

#include

pid_tfork(void)

成功调用fork()会创建一个新的进程,它几乎与调用fork()的进程一模一样。

这两个进程都会同时运行,调用者从fork()返回以后,就好像没有什么特别的事情发生过。

新进程称为原来进程的子进程,原来进程自然就是父进程,在子进程中,成功的fork()调用会返回0,在父进程中fork()返回子进程的pid.

 

3.wait()函数调用

#include

#include

pid_twait(int*status)

进程一旦调用了wait,就立即阻塞了自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样的一个子进程,wait就会一直阻塞在这里,直到一个出现为止。

参数status用来保存被收集的进程退出时的一些状态,它是一个指向int类型的指针

4.sleep()函数调用

#include

unsignedintsleep(unsignedintsecond)

该函数使得进程挂起一个指定的时间,直到知道时间用完或收到信号。

如果挂起时间到了,就返回0;如果该函数被信号打断,则返回剩余挂起的时间数

 

Fork3.c

#include

#include

#include

voidmain()

{

intp1;

while((p1=fork())==-1);

if(p1>0)//如果是从父进程返回

{

wait(0);//等待子进程结束

printf("hereisparent,theforkreturnp1is%d\n",p1);

}

else

{

printf("hereisthesonthetheforkreturnp1is%d",p1);

exit(0);//结束子进程

}

}

 

Fork4.c

#include

#include

#include

#include

voidmain()

{

intp1=-1;

intp2=-1;

intson1=0,son2=0;//分别标识两个子进程

while((p1=fork())==-1);

if(p1==0){son1=1;}//标识第一个子进程

if(p1>0){while((p2=fork())==-1);}

if(p2==0){son2=1;}//标识第二个子进程

if(p1>0&&p2>0)//父进程执行

{

wait(0);

printf("hereisparent,theforkreturnp1andp2is%d,%d",p1,p2);

printf("son1%d,son2%d\n",son1,son2);

}

elseif(son1)//第一个子进程执行的代码

{//获得进程ID打印出子进程ID

printf("hereisthefirstsonthethepidis%d",getpid());

printf("son1%dson2%d\n",son1,son2);

exit(0);

}

elseif(son2)//第二个子进程执行的代码

{

printf("hereisthesecondsonthepidis%d",getpid());

printf("son1%d,son2%d",son1,son2);

exit

(1);

}

}

windowsprocessCreate.cpp

//---------------------------------------------------------------------------

#include

#pragmahdrstop

//---------------------------------------------------------------------------

#pragmaargsused

#include"iostream.h"

intAPIWinExec();

intAPIShellExecute();

intCreateProcess();

//---------------------------------------------------------------------------

intmain(intargc,char*argv[])

{

APIWinExec();

APIShellExecute();

CreateProcess();

cin.get();

return0;

}

intAPIWinExec()

{

cin.get();

cout<<"WinExec(\"NotePad\",SW_RESTORE)"<

WinExec("NotePad",SW_RESTORE);

cin.get();

cout<<"WinExec(\"NotePad\.\\test.txt\",SW_RESTORE)"<

WinExec("NotePad\.\\test.txt",SW_RESTORE);

cin.get();

cout<<"WinExec(\"Calc\",SW_RESTORE)"<

WinExec("Calc",SW_RESTORE);

cin.get();

cout<<"WinExec(\"Rundll32.exeshell32.dll,Control_RunDLLtimedate.cpl\",SW_RESTORE)"<

WinExec("Rundll32.exeshell32.dll,Control_RunDLLtimedate.cpl",SW_RESTORE);

}

//---------------------------------------------------------------------------

intAPIShellExecute()

{

cin.get();

cout<<"ShellExecute(NULL,\"open\",\"NotePad\",NULL,NULL,SW_RESTORE)"<

ShellExecute(NULL,"open","NotePad",NULL,NULL,SW_RESTORE);

cin.get();

cout<<"ShellExecute(NULL,\"open\",\"\.\\test.txt\",NULL,NULL,SW_RESTORE)"<

ShellExecute(NULL,"open","\.\\test.txt",NULL,NULL,SW_RESTORE);

cin.get();

cout<<"ShellExecute(NULL,\"open\",\"Calc\",NULL,NULL,SW_RESTORE)"<

ShellExecute(NULL,"open","Calc",NULL,NULL,SW_RESTORE);

cin.get();

cout<<"ShellExecute(NULL,\"explore\",\"D:

\",NULL,NULL,SW_RESTORE)"<

ShellExecute(NULL,"explore","D:

",NULL,NULL,SW_RESTORE);

}

//---------------------------------------------------------------------------

/*BOOLCreateProcess(

LPCTSTRlpApplicationName,//pointertonameofexecutablemodule

LPTSTRlpCommandLine,//pointertocommandlinestring

LPSECURITY_ATTRIBUTESlpProcessAttributes,//pointertoprocesssecurityattributes

LPSECURITY_ATTRIBUTESlpThreadAttributes,//pointertothreadsecurityattributes

BOOLbInheritHandles,//handleinheritanceflag

DWORDdwCreationFlags,//creationflags

LPVOIDlpEnvironment,//pointertonewenvironmentblock

LPCTSTRlpCurrentDirectory,//pointertocurrentdirectoryname

LPSTARTUPINFOlpStartupInfo,//pointertoSTARTUPINFO

LPPROCESS_INFORMATIONlpProcessInformation//pointertoPROCESS_INFORMATION

);

*/

intCreateProcess()

{

cin.get();

cout<<"CreateProcess"<

STARTUPINFOsi;

ZeroMemory(&si,sizeof(STARTUPINFO));

si.cb=sizeof(STARTUPINFO);

PROCESS_INFORMATIONpi;

BOOLfCreated=CreateProcess("C:

\\ProgramFiles\\MicrosoftOffice\\OFFICE11\\WinWord.exe",

NULL,

NULL,

NULL,

FALSE,

CREATE_NEW_PROCESS_GROUP,

NULL,

NULL,

&si,

&pi

);

}

 

Fork3.运行如下:

Fork4.c运行如下:

通过本次试验,了解了linux下进程控制块的基本结构,对linux的进程和线程的区别和联系有个比较清楚的认识,能够在终端管理进程。

对父进程和子进程之间的关系也有了比较清楚的认识,能够在linux下用c语言创建进程,子进程,销毁进程等。

对进程的同步互斥有一定的理解。

Windos下和linux下的进程在结构上也有相似的地方。

实验分项3

实验三进程同步与通信管理

 

熟悉掌握进程的通信管理

进程同步与互斥控制(读者写者、一家人吃苹果桔子、哲学家吃饭)

简单进程通信(管道、消息缓冲、邮件槽等)(原码阅读与系统编程级)

信号量实现进程同步

#include

#include

#include

intk1;

voidint_fun1(intsig)

{

k1=0;

}

main()

{

intk,p1;

while(p1=fork()==-1);

if(p1>0)

{

for(k=0;k<4;k++)

{printf("Howareyou!

\n");

sleep

(1);

}

kill(p1,12);

wait(0);

printf("OK!

\n");

exit(0);

}

else{

signal(12,int_fun1);//通过改变信号量实现进程同步先父进程再进程

k1=1;

while(k1==1){

printf("Ianchild\n");

sleep

(1);

}

printf("childexited!

\n");

exit(0);

}

}

fd.c

#include

#include

#include

#include

main()

{

intp1,fd[2];

charoutpipe[50];

charinpipe[50]="thisisamessage!

";

pipe(fd);

while((p1=fork())==-1);

if(p1==0)

{

printf("%d",fd[1]);

write(fd[1],inpipe,50);

printf("childwrite:

%s",inpipe);

exit(0);

}

else{

wait(0);

printf("%d",fd[0]);

read(fd[0],outpipe,50);

printf("parentread:

%s\n",outpipe);

printf("exit\n");

exit(0);

}

}

 

rcvfile.c

#include

#include

#include

#include

#include

#include

#defineMaxMsg512

structmy_msg

{

longintmy_msg_type;

charsome_text[MaxMsg];

}msg;

main()

{

intmsgid;

longintmsg_to_receive=0;

msgid=msgget(1234,0666|IPC_CREAT);

while

(1)

{

msgrcv(msgid,&msg,BUFSIZ,msg_to_receive,0);

printf("youwrote:

%s",msg.some_text);

if(strncmp(msg.some_text,"end",3)==0)

break;

}

msgctl(msgid,IPC_RMID,0);

exit(0);

}

 

Sndfile.c

#include

#include

#include

#include

#include

#include

#defineMaxMsg512

structmy_ms

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1