江苏大学操作系统课程设计Linux系统管理实践与进程通信实现.docx

上传人:b****6 文档编号:5820261 上传时间:2023-01-01 格式:DOCX 页数:21 大小:958.97KB
下载 相关 举报
江苏大学操作系统课程设计Linux系统管理实践与进程通信实现.docx_第1页
第1页 / 共21页
江苏大学操作系统课程设计Linux系统管理实践与进程通信实现.docx_第2页
第2页 / 共21页
江苏大学操作系统课程设计Linux系统管理实践与进程通信实现.docx_第3页
第3页 / 共21页
江苏大学操作系统课程设计Linux系统管理实践与进程通信实现.docx_第4页
第4页 / 共21页
江苏大学操作系统课程设计Linux系统管理实践与进程通信实现.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

江苏大学操作系统课程设计Linux系统管理实践与进程通信实现.docx

《江苏大学操作系统课程设计Linux系统管理实践与进程通信实现.docx》由会员分享,可在线阅读,更多相关《江苏大学操作系统课程设计Linux系统管理实践与进程通信实现.docx(21页珍藏版)》请在冰豆网上搜索。

江苏大学操作系统课程设计Linux系统管理实践与进程通信实现.docx

江苏大学操作系统课程设计Linux系统管理实践与进程通信实现

 

 

操作系统课程设计

——Linux系统管理实践与进程通信实现

 

班级网络10

学号31006100

姓名YHD

指导老师詹永照

二零一三年一月八号

一、设计内容

1、Linux系统的熟悉与常用操作命令的掌握。

2、Linux环境下进程通信的实现。

(实现父母子女放水果吃水果的同步互斥问题,爸爸放苹果,女儿专等吃苹果,妈妈放橘子,儿子专等吃橘子,盘子即为缓冲区,大小为5。

二、Linux环境介绍

1、Linux的由来与发展

Linux是一种可以在PC机上执行的类似UNIX的操作系统,是一个完全免费的操作系统。

1991年,芬兰学生LinuxTorvalds开发了这个操作系统的核心部分,因为是Linux改良的minix系统,故称之为Linux。

2、Linux的优点

(1)Linux具备UNIX系统的全部优点

Linux是一套PC版的UNIX系统,相对于Windows是一个十分稳定的系统,安全性好。

(2)良好的网络环境

Linux与UNIX一样,是以网络环境为基础的操作系统,具备完整的网络功能,提供在Internet或Intranet的邮件,FTP,www等各种服务。

(3)免费的资源

Linux免费的资源和公开的源代码方便了对操作系统的深入了解,给编程爱好者提供更大的发挥空间。

3、Linux的特点

1)全面的多任务,多用户和真正的32位操作系统

2)支持多种硬件,多种硬件平台

3)对应用程序使用的内存进行保护

4)按需取盘

5)共享内存页面

6)使用分页技术的虚拟内存

7)优秀的磁盘缓冲调度功能

8)动态链接共享库

9)支持伪终端设备

10)支持多个虚拟控制台

11)支持多种CPU

12)支持数字协处理器387的软件模拟

13)支持多种文件系统

14)支持POSIX的任务控制

15)软件移植性好

16)与其它UNIX系统的兼容性

17)强大的网络功能

三、常用命令介绍

1、目录操作

和DOS相似,Linux采用树型目录管理结构,由根目录(/)开始一层层将子目录建下去,各子目录以/隔开。

用户login后,工作目录的位置称为homedirectory,由系统管理员设定。

‘~’符号代表自己的homedirectory,例如~/myfile是指自己home目录下myfile这个文件。

Linux的通配符有三种:

’*’和’?

’用法与DOS相同,‘-‘代表区间内的任一字符,如test[0-5]即代表test0,test1,……,test5的集合。

(1)显示目录文件ls

执行格式:

ls[-atFlgR][name](name可为文件或目录名称)

例:

ls显示出当前目录下的文件

ls-a显示出包含隐藏文件的所有文件

ls-t按照文件最后修改时间显示文件

ls-F显示出当前目录下的文件及其类型

ls-l显示目录下所有文件的许可权、拥有者、文件大小、修改时间及名称

ls-lg同上

ls-R显示出该目录及其子目录下的文件

注:

ls与其它命令搭配使用可以生出很多技巧(最简单的如"ls-l|more"),更多用法请输入ls--help查看,其它命令的更多用法请输入命令名--help查看。

(2)建新目录mkdir

执行格式:

mkdirdirectory-name

例:

mkdirdir1(新建一名为dir1的目录)

(3)删除目录rmdir

执行格式:

rmdirdirectory-name或rmdirectory-name

例:

rmdirdir1删除目录dir1,但它必须是空目录,否则无法删除

rm-rdir1删除目录dir1及其下所有文件及子目录

rm-rfdir1不管是否空目录,统统删除,而且不给出提示,使用时要小心

(4)改变工作目录位置cd

执行格式:

cd[name]

例:

cd改变目录位置至用户login时的workingdirectory

cddir1改变目录位置,至dir1目录

cd~user改变目录位置,至用户的workingdirectory

cd改变目录位置,至当前目录的上层目录

cd/user改变目录位置,至上一级目录下的user目录

cd/dir-name1/dir-name2改变目录位置,至绝对路径(Fullpath)

cd回到进入当前目录前的上一个目录

(5)显示当前所在目录pwd

执行格式:

pwd

(6)查看目录大小du

执行格式:

du[-s]directory

例:

dudir1显示目录dir1及其子目录容量(以kb为单位)

du-sdir1显示目录dir1的总容量

(7)显示环境变量

echo$HOME显示家目录

echo$PATH显示可执行文件搜索路径

env显示所有环境变量(可能很多,最好用"env|more","env|grepPATH"等)

(8)修改环境变量,在bash下用export,如:

exportPATH=$PATH:

/usr/local/bin

想知道export的具体用法,可以用shell的help命令:

helpexport

2、文件操作

(1)查看文件(可以是二进制的)内容cat

执行格式:

catfilename或morefilename或catfilename|more

例:

catfile1以连续显示方式,查看文件file1的内容

morefile1

或catfile1|more以分页方式查看文件的内容

(2)删除文件rm

执行格式:

rmfilename

例:

rmfile?

rmf*

(3)复制文件cp

执行格式:

cp[-r]sourcedestination

例:

cpfile1file2将file1复制成file2

cpfile1dir1将file1复制到目录dir1

cp/tmp/file1将file1复制到当前目录

cp/tmp/file1file2将file1复制到当前目录名为file2

cp–rdir1dir2(recursivecopy)复制整个目录。

(4)移动或更改文件、目录名称mv

执行格式:

mvsourcedestination

例:

mvfile1file2将文件file1,更名为file2

mvfile1dir1将文件file1,移到目录dir1下

mvdir1dir2

(5)比较文件(可以是二进制的)或目录的内容diff

执行格式:

diff[-r]name1name2(name1、name2同为文件或目录)

例:

difffile1file2比较file1与file2的不同处

diff-rdir1dir2比较dir1与dir2的不同处

(6)文件中字符串的查找grep

执行格式:

grepstringfile

例:

grepabcfile1查找并列出串abc所在的整行文字

(7)文件或命令的路径寻找

执行格式一:

whereiscommand显示命令的路径

执行格式二:

whichcommand显示路径及使用者所定义的别名

执行格式三:

whatiscommand显示命令的功能摘要

执行格式四:

findsearch-path-namefilename-print搜寻指定路径下某文件的路径

执行格式五:

locatefilename

根据系统预先生成的文件/目录数据库(/var/lib/slocate/slocate.db)查找匹配的文件/目录,查找速度很快,如果有刚进行的文件改变而系统未到执行定时更新数据库的时间,可以打入updatedb命令手动更新。

(8)建立文件或目录的链接ln

例:

lnsourcetarget1建立source文件(已存在)的硬链接,命名为target1

ln-ssourcetarget2建立source文件的符号链接,命名为target2

以下是几个常用命令操作的截图:

四、设计思想

当计算机中两个或多个进程在执行时需要使用公用缓冲区,并且对该缓冲区采取了互斥措施。

这时如果并发执行这些进程就会造成CPU的极大浪费,这是操作系统设计要求不允许的。

而这种现象在操作系统和用户进程中大量存在。

因此为了解决这一问题,提出了同步的概念,即把异步环境下的一组并发进程,因直接制约而互相发送消息、互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。

在本次设计中,爸爸与妈妈、儿子与女儿的进程操作是互斥的,但是爸爸与女儿、妈妈与儿子进程之间的操作是同步的。

因此要利用进程同步的方法来实现这几者之间的操作,当然其中也包含着互斥进程,因为盘子每次只能放入或取出一个水果。

程序设计中有如下四个进程:

father(),mother(),daughter(),son()。

 

五、数据结构

1、信号量semid_mutex作为进程的公有信号量,其初始值为1,可以实现进程间的互斥,同时可以表示当前状态下盘子里可以放几个水果,实现进程间的同步。

2、信号量semid_full1为进程father()与daughter()的私有信号量,初值为0,表示当前盘子里苹果的数目。

3、信号量semid_full2为进程mother()与son()的私有信号量,初值为0,表示当前盘子里橘子的数目。

六、设计流程

爸爸放苹果流程图:

妈妈放橘子流程图:

女儿吃苹果流程图:

儿子吃橘子流程图:

7、源代码

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#defineSHMKEY9090/*共享存储区的键*/

#defineSEMKEY_EMPTY9091

#defineSEMKEY_MUTEX9092

#defineSEMKEY_FULL19093

#defineSEMKEY_FULL29094/*信号量数组的键*//*注意:

上面的键在系统中必须唯一*/

#defineBUFF_LEN5/*缓冲区可以存放10个产品*/

#definePRODUCT_LEN1/*每个产品是一个字符串:

<=32字符*/

voidset_sembuf_struct(structsembuf*sem,intsemnum,intsemop,intsemflg)

{

/*设置信号量结构*/

sem->sem_num=semnum;

sem->sem_op=semop;

sem->sem_flg=semflg;

}

intbegin()

{

char*addr,end;

intshmid;

intsemid_empty,semid_full1,semid_full2,semid_mutex;

structsembufsem_tmp;

/*开辟共享存储区*/

if((shmid=shmget(SHMKEY,BUFF_LEN*PRODUCT_LEN+3,0777|IPC_CREAT|IPC_EXCL))==-1)

{

if(errno==EEXIST)

{

printf("TheBufferHasExisted!

\n");

printf("DoYouWantToDeleteTheBuffer(Y=yes)?

\n====:

");

scanf("%c",&end);

if(end=='y'||end=='Y')

{

/*共享存储区、信号量并不随程序的结束而被删除,如果我们没删除的话,

可以用ipcs命令查看,用ipcrm删除

*/

/*释放缓冲区*/

shmid=shmget(SHMKEY,BUFF_LEN*PRODUCT_LEN+3,0777);

if(shmctl(shmid,IPC_RMID,0)<0)

perror("shmctl:

falsed");

/*同时释放信号量*/

semid_mutex=semget(SEMKEY_MUTEX,1,0777);/*获取全局信号量id*/

semid_empty=semget(SEMKEY_EMPTY,1,0777);

semid_full1=semget(SEMKEY_FULL1,1,0777);

semid_full2=semget(SEMKEY_FULL2,1,0777);

semctl(semid_mutex,0,IPC_RMID);

semctl(semid_empty,0,IPC_RMID);

semctl(semid_full1,0,IPC_RMID);

semctl(semid_full2,0,IPC_RMID);

}

}

else

printf("FailToCreateBuffer!

\n");

return-1;

}

addr=(char*)shmat(shmid,0,0);/*连接缓冲区*/

memset(addr,0,BUFF_LEN*PRODUCT_LEN+3);//初始化存储区为0

shmdt(addr);/*离开缓冲区*/

/*创建3个信号量:

1个用于对缓冲区互斥,2个用于生产者、消费者同步*/

if((semid_mutex=semget(SEMKEY_MUTEX,1,0777|IPC_CREAT|IPC_EXCL))==-1)

{

if(errno==EEXIST)

printf("TheSEMKEY_MUTEXHasExisted!

\n");

else

printf("FailToCreateSEMKEY_MUTEX!

\n");

return-1;

}

if((semid_empty=semget(SEMKEY_EMPTY,1,0777|IPC_CREAT|IPC_EXCL))==-1)

{

if(errno==EEXIST)

printf("TheSEMKEY_EMPTYHasExisted!

\n");

else

printf("FailToCreateSEMKEY_EMPTY!

\n");

return-1;

}

if((semid_full1=semget(SEMKEY_FULL1,1,0777|IPC_CREAT|IPC_EXCL))==-1)

{

if(errno==EEXIST)

printf("TheSEM_FULL1HasExisted!

\n");

else

printf("FailToCreateSEM_FULL1!

\n");

return-1;

}

if((semid_full2=semget(SEMKEY_FULL2,1,0777|IPC_CREAT|IPC_EXCL))==-1)

{

if(errno==EEXIST)

printf("TheSEM_FULL2HasExisted!

\n");

else

printf("FailToCreateSEM_FULL2!

\n");

return-1;

}

/*给信号量赋初值*/

set_sembuf_struct(&sem_tmp,0,BUFF_LEN,0);/*BUFF_LEN*/

semop(semid_empty,&sem_tmp,1);

set_sembuf_struct(&sem_tmp,0,0,0);/*0*/

semop(semid_full1,&sem_tmp,1);

set_sembuf_struct(&sem_tmp,0,0,0);/*0*/

semop(semid_full2,&sem_tmp,1);

set_sembuf_struct(&sem_tmp,0,1,0);/*1*/

semop(semid_mutex,&sem_tmp,1);

return0;

}

/*下面的P,V是对系统调用的简单封装*/

intP(intsemid)

{

structsembufp_buf;

p_buf.sem_num=0;

p_buf.sem_op=-1;

p_buf.sem_flg=0;

if(semop(semid,&p_buf,1)==-1)/*semop参见课件ppt*/

{

perror("p(semid)falsed");

exit

(1);

}

else

return0;

}

intV(intsemid)

{

structsembufv_buf;/*struct参见课件ppt*/

v_buf.sem_num=0;

v_buf.sem_op=1;

v_buf.sem_flg=0;

if(semop(semid,&v_buf,1)==-1){

perror("v(semid)failed");

exit

(1);

}

else

return0;

}

intfather()

{

intsemid_empty,semid_full1,semid_full2,semid_mutex;/*信号量集合id*/

intrc1,rc2,rc3;

semid_mutex=semget(SEMKEY_MUTEX,1,0777);/*获取全局信号量id*/

semid_empty=semget(SEMKEY_EMPTY,1,0777);

semid_full1=semget(SEMKEY_FULL1,1,0777);

semid_full2=semget(SEMKEY_FULL2,1,0777);

rc1=semctl(semid_empty,0,GETVAL);

rc2=semctl(semid_mutex,0,GETVAL);

if(rc1==0)

{

return1;//不能放則等待

}

if(rc2==0)

{

return1;

}

P(semid_empty);/*对私有信号量作P操作*/

P(semid_mutex);

printf("thereis%dplacestoputapples\n",rc1);

printf("PUTANAPLLE\n");

V(semid_mutex);

V(semid_full1);

rc3=semctl(semid_full1,0,GETVAL);

printf("daughtercanget%dapples\n",rc3);

return0;

}

intmother()

{intsemid_empty,semid_full1,semid_full2,semid_mutex;/*信号量集合id*/

intrc1,rc2,rc3;

semid_mutex=semget(SEMKEY_MUTEX,1,0777);/*获取全局信号量id*/

semid_empty=semget(SEMKEY_EMPTY,1,0777);

semid_full1=semget(SEMKEY_FULL1,1,0777);

semid_full2=semget(SEMKEY_FULL2,1,0777);

rc1=semctl(semid_empty,0,GETVAL);

rc2=semctl(semid_mutex,0,GETVAL);

if(rc1==0)

{

return1;//不能放則等待

}

elseif(rc2==0)

{

return1;

}

P(semid_empty);/*对私有信号量作P操作*/

P(semid_mutex);

printf("thereis%dplacestoputoranges\n",rc1);

printf("PUTANORANGE!

!

!

\n");

V(semid_mutex);

V(semid_full2);

rc3=semctl(semid_full2,0,GETVAL);

printf("soncanget%doranges\n",rc3);

return0;

}

intson()

{

intsemid_empty,semid_full1,semid_full2,semid_mutex;/*信号量集合id*/

intrc1,rc2;

semid_mutex=semget(SEMKEY_MUTEX,1,0777);/*获取全局信号量id*/

semid_empty=semget(SEMKEY_EMPTY,1,0777);

semid_full1=semget(SEMKEY_FULL1,1,0777);

semid_full2=semget(SEMKEY_FULL2,1,0777);

rc2=semctl(semid_full1,0,GETVAL);

rc1=semctl(semid_full2,0,GETVAL);

if(rc1==0)

{

return1;//不能放則等待

}

P(semid_full2);/*对私有信号量作P操作*/

P(semid_mutex);

printf("SUM:

%dapplesand%doranges\n",rc2,rc1);

printf("thereis%dorangestoget\n",rc1);

printf("GETANORANGE!

!

!

\n");

V(semid_empty);

V(semid_mutex);

return0;

}

intdaughter()

{

intsemid_empty,semid_full1,semid_full2,semid_mutex;/*信号量集合id*/

intrc1,

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

当前位置:首页 > 外语学习 > 英语学习

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

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