版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2023-2023学年第2学期操作系统课程设计
规定:
1.每位同学按学号尾数作相应的课题,如1号同学做课题一,2号同学作课题二。
2.允许同学之间换题。
3.允许用不同的方法作课题,即可以在Windows、Linux下采用各种编程
语言和开发工具实现课题所规定的功能。(所附资料仅供参考)
课程设计报告格式
一、课程设计目的
二、课题内容
三、设计思绪
四、源代码
五、运营与测试
六、心得体会
课题一:编写一个小型命令解决器sma1Ishe1I
一、目的
设计并实现一个简朴的命令解决程序,名字为smallshe11。规定具有以下基本功能:
1.支持交互式的用户界面
2.支持内置命令:cd,exit,设立搜索途径path等。
3.支持可执行文献的运营
4.支持输入输出重定向功能
5.支持管道功能
二、准备知识
1.交互式用户界面
在sma11shell中,显示如下格式的交互界面:
[semame@servername:pathname]$
需要涉及以下函数:
#include<uniste.h>
char*get1ogin(void);
/*getlogin函数返回与当前用户关联的用户名*/
intgethostname(char*name,size_tnamelen);
/*gethostname函数把机器的网络名写到字符串name中,name的长度为namelen,因此
该字符串的长度不得超过name1en个字符,函数成功返回0,否则返回-1。*/
#include<unistd>
char*getcwd(char*name,size_tsize);
/getcwd函数返回一个指向当前工作目录的指针,并将当前工作目录存于name中,假如
该目录名长度超过size给出的长度,返回NULL。若size为0,返回一1。*/
例如,下面这段程序模仿了pwd命令:
#inc1ude<stdio.h>
#inc1ude<unistd.h>
#defineVERYBIG200
voidmy_pwd(void);
main()
{
my_pwd();
}
voidmy_pwd(void);
{
chardirname[VERYBIG];
if(getcwd(dirname,VERYBIG)==NULL)
printf("geicwderror");
else
printf("%s”,dirname);
)
2.支持内置命令:cd,exit,设立搜索途径path等。
假如用户输入内置命令,smal1she11根据命令名及参数进行相应解决。下面以cd,
exit,path命令为例,分别说明其实现所涉及的函数。。
(1)cd命令
该命令用于切换当前目录,可以通过chdir()函数实现。chdir()使当前目录变为path所
指向的目录,该函数的用法如下:
#inc1ude<unistd.h>
intchdir(constchar*path);
chdir在失败的情况下返回-1。需要注意的是,chdir只影响调用进程,并不会影响启动这
个进程的she11进程。
例如,使用chdir("/usr/bin");可切换到/usr/bin目录。
(2)exit命令
。该命令用于退出smallshell,需要调用exit函数实现,exit函数用法如下:
#include<stdlib.h>
•voidexit(intstatus);
(3)path命令
。该命令用于设立搜索途径。可以设立一个全局变量gpath,实现对搜索途径的更新。
3.支持可执行文献的运营
假如用户输入的不是内置命令,而是一个可执行文献名,则需要在设立的途径中搜索该命令,
并在此环境中执行。可以通过access()函数先对该命令进行测试:
#inc1ude<unistd.h>
intaccess(constchar*pathname,intmode);
该函数根据用户id测定进程是否具有访问某个特定文献的权限。参数pathname表
达的是文献的名字,参数mode有三种也许的取值,它们的定义在<unistd.h>中可以找到:
R_OK调用进程是否具有读访问权限
W_OK调用进程是否具有写访问权限
X_OK调用进程是否具有执行权限
access函数返回0,表达用户对文献具有访问权限,返回-1表达不具有此种访问
权限。
假如命令可执行,下一步是创建smallsheII的子进程,之后让子进程执行这个可执行文献。
因此需要用到fork和exec类函数。f。rk函数的使用请参考课程实验指导书,exec类函
数有6个,这里可以用其中的execve()函数,用法如下:
#include<unistd.h>
intexecve(constchar*pathname,char*constargv[],char*constenvp
[];
pathname参数是子进程要执行的文献的途径名,argv是一个参数字符串列表,envp是一
个
环境变量字符串和值的列表。execve成功不会返回,失败返回一1.
例:
cmd=^^helloworld";//helloworld是一一个可执行文献
char*envp[]={"PATH=/home/stul”,0};
exeeve(emd,NULL,envp);〃执行he1lowor1d
4.支持输入输出重定向功能
每个进程的描述符中包含一个file_struct结构,记录用户的文献打开情况,这个结构称为用
户打开文献表。并且用户打开文献表的信息在fork()和exec()调用后将仍然保持和继承。
进程的打开文献表记录进程已经打开的文献描述符,即指向文献对象的指针。通常系统为正
在执行的进程自动打开三个文献:标准输入(键盘),标准输出(显示器),标准错误。通常相
应文献描述符0,1,2。因此,输入输出重定向实际就是将标准输入和标准输出的文献描
述符指向用户指定的文献。可以使用下列函数实现:
#inc1ude<unistd.h>
fid=open(constchar*pathname,intf1ags);
intdup2(intoldfd,intnewfd);
open函数打开一个文献,返回该文献的描述符。参数pathname是文献的途径名,flag指
定文献存取模式,取值为:O_RD0NLY,O_WRONLY,O_RDWR,O_CREATE等。
dup2函数将老的文献描述符。1dfd复制到新的文献描述符newfd,即创建一个。1dfd的
拷贝。
例如:
fid=open(fi1ename,O_WRONLY|O_CREAT);
//以写的方式创建并打开文献fi1ename
dup2(fid,l);〃将文献描述符复制到标准输出,即输出时便输出到新建文献
中,
〃从而实现了输出重定向。
5.支持管道功能
she11中的管道功能是将一个命令的输出作为另一个命令的输入。可以用pipe函数创建无
名管道。返回的Pipe文献描述符只能被同一家族的父子进程使用,因此可以用fork函数
和exec函数创建两个不同的进程并使其具有父子关系,之后使一个进程的输出重定向到管
道,另一个进程的输入重定向到管道,从而实现管道功能。程序框架如下:
intfd[2];
pipe(fd);
if(fork>0){//父进程
c1ose(fd[0]);//关闭用于读文献的描述符
dup2(fd[l],l);〃父进程实现输出重定向
)
else{//子进程
close(fdEl]);//关闭用于写的文献描述符
dup2(fd[0],0);〃子进程实现输入重定向
三、smal1shel1总体结构
♦课题二使用SystemV的IPC机制实现“生产者-消费者”问题
一、目的
学习SystemV的进程间通信机制,使用信号量和共享内存实现经典进程同步问题“生产者一
消费者”问题。具体规定:
1.创建信号量集,实现同步互斥信号量。
2.创建共享内存,模拟存放产品的公共缓冲池。
3.创建并发进程,实现进程对共享缓冲池的并发操作。
二、准备知识
1.信号量集
(1)创建信号量集
#inc1ude<sys/sem.h>
intsemget(key_tkey,intnsems,intpermflags);
该调用与文献的open或creat相似,参数key是一个标记信号量集的数,参数nsems是信
号量集中包含的信号量的个数,元素索引从。到nsems-1,permflags是semget函数将
实现的操作,有两个值供选择,在头文献<sys/ipc.h>有定义,这两个值可以单独使用,也可
用"或''位运算符连起来使用:
IPC_CREAT:创建一个key所代表的新信号量集,类似于creat。
IPC_EXCL:同IPC_CREAT都设立时,若key相应信号量集存在,则返回-1,并将错误
指示变量errno置EEXIST«
例如:semid=semget((key_t)OO10,1,0600IIPC_CREAT|IPC_EXCL);
注意:这里0600表达对该信号量集的存取权限,设立的方式同文献存取权限的设立一致。
0600表达对信号量集的创建者具有读写权限,对同组用户和其他用户无任何权限。
(2)信号量控制
#include<sys/sem.h>
intsemctl(intsemid,intsem_num,intcommand,unionsemunct1_arg);
该函数可以对semid表达的信号量集中的第sem_num号信号量执行c。mmand指示的
操作。sem_num是信号量的索引号,注意,索引号从0开始。command给出要完毕何种功
能,功能可分为种:标准IPC功能、只对单个信号量起作用的功能、影响整个信号量集的功
能。
标准IPC函数
IPC_STAT:把状态信息放入ct1_arg.buf
IPC_SET:用stJarg.buf中的值设立信号量的所有权/许可权
IPC_RMID:从系统中删除信号量集(此时sem_num参数忽略)
单信号量操作
GETVAL:返回信号量的值
SETVAL:设立信号量的值,写入ctl_arg.val
GETPID:返回最后一个对sem_num号信号量执行semop操作的进程id
GETNCNT:返回等待sem_num号信号量值增长的进程数,即在该信号量上等待的进程
数
GETZCNT:返回等待sem_num号信号量值变为0的进程数。
全信号量操作
GETALL:返回所有信号量的值,结果保存在ctl_arg.array,忽略参数sem_num
SETALL:通过ct1_arg.array更新所有信号量的值。
参数sem_num与上述第二类功能选项一起使用,以针对某一个信号量。参数ctl_arg是调
用该函数的进程必须事先定义的一个联合体,定义如下;
unionsemun{
intval;
structsemid_ds*buf;
unsignedshort*array
);
unionsemunctl_arg;
联合体中的三个成员分别相应semct1的三个功能,val是针对信号量值的,例如赋初值。
结构体semid_ds是IPC_STAT和IPC_SET的缓冲,array针对全信号量操作。
(3)信号量操作
#include<sys/sem.h>
intsemop(intsemid,structsembuf*op_array,size_tnum_ops);
该函数可以实现信号量的p、v操作。参数semid是信号量集的标记符,op_array指向s
embuf结构体类型的数组,参数num_ops是操作的个数。下面给出sembuf的结构:
structsembuf{
unsignedshortsem_num;//存放信号量在信号量集合中的索引
oShortsem_op;〃1,-1分别可表达加一和减一操作,相称与V、P操作
"shortsem_f1g;//标志,设立SEM_UNDO表达进程退出时自动还原
)
例如,下面这段程序可以实现针对一个信号量的P操作:
intP(intsemid)
6//semid是信号量集的标记符
{structsembufp_buf;
oP_buf.sem_num=0;0
p__buf.sem_op=-1;
op_buf.sem_f1g=SEM_UNDO;
if(semop(semid,&p_buf,1)==-1)〃第三个参数是p—buf指向的sem
buf数组的大小
。{perror("p(semid)fai1edn);
。exit(1);
°)
retum(0);
)
2.共享存储
共享存储操作适得两个或两个以上的进程可以共用一段物理内存(一般情况下,两个进程的
数据区是完全独立的,父进程用fork创建子进程后,子进程会复制父进程数据到自己的
数据区)。
(1)创建共享内存
#inc1ude<sys/shm.h>
intshmget(key_tkey,size_tsize,intpermflags);
参数key是共享内存的标记,size是共享内存段的最小字节数,permflags是访问权限,
值的设立同semget同样。
(2)共享内存的控制
#include<sys/shm.h>
intshmct1(intshmid,intcommand,structshmid_ds*shm_stat);
该函数semet1相似,command可设为IPC_STAT,IPC_SET,IPC_RMIDO参数shm_s
tat指向存放属性的结构体,具体内容请参考手册。
(3)共享内存的附接和断开
#include<sys/shm.h>
void*shmat(intshmid,constvoid*addr,intshmf1ags);
intshmdt(constvoid*addr);
由于两个函数需指出进程地址空间中的地址,因此比较复杂。简化的方法是将shmat中的
地址设为NULLo
三、程序框架
//semaphoreheaderfi1e
#include<sys/types.h>
#include<sys/ipc.h>
#include<sysZsem.h>
#inc1ude<errno.h>
#inc1ude<stdlib.h>
#inc1ude<stdio.h>
#include<unistd.h>
typedefunion_semun{
//定义联合体
}semun;
structdatabuf{〃定义“生产者-消费者”问题中存放数据的buffer
);
staticintshmid,semid;
voidinitshm(structdatabuf**p)〃创建共享存储区,并附接到调用进程
(
)
intinitsem()
//创建信号量集,并初始化
)
voidremobj(void)
//删除IPC对象
if(shmctl(shmid,IPC_RMID,NULL)==—1)printf(nshmctlerror1');
if(semctl(semid,IPC_RMID,0)==—1)printf("\nsemctlremobjerror\
intP()
〃定义p操作
。}
intV()〃定义v操作
{
}
voidproducer()//生产者
voidconsumer()
//消费者
main()//主程序
(
key_tsemkey,shmkey;
structdatabuf*buf;//产品缓冲池
initshm(&buf);//创建共享存储区,并附接到buf指针指示的位置
semid=initsem(semkey);//创建信号量集
..//创建若干并发进程,实现producer与consume
r的并发执行
remobjO;。。〃删除IPC对象…
)
♦课题三使用SystemV的IPC机制实现“读者-写者”问题
一、目的
学习SystemV的进程间通信机制,使用信号量和共享内存实现经典进程同步问题“读者-
写者”问题。具体规定:
1.创建信号量集,实现互斥信号量。
2.创建共享内存,将“读者一写者”共享的文献保存其中,并保存读者共享的计数值。
3.创建并发进程,实现“读者-写者”的并发操作。
二、准备知识
见课题二
三、程序框架
//semaphoreheaderfile
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<errno.h>
#include<std1ib.h>
#include<stdio.h>
#include<unistd.h>
typedefunion_semun{
//定义联合体
}semun;
staticintshmid,semid;
voidinitshm(structdatabuf**p)//创建共享存储区,并附接到调用进程
intinitsem()
〃创建信号量集,并初始化
voidremobj(void)
//删除IPC对象
{
if(shmet1(shmid,IPC_RMID,NULL)==-1)printf("shmct1error");
if(semetl(semid,IPC_RMID,0)==-1)printf("\nsemctlremobjerror\n");
}
intP()
〃定义p操作
intV()//定义v操作
voidreader()//读者
)
voidwriter()//写者
(
)
main()〃主程序
{
key_tsemkey,shmkey;
int*readercount//读者计数值
initshm(&readercount);〃创建共享存储区,并附接到readercount
指针指示的位置
semid=initsem(semkey);〃创建信号量集
.......〃创建若干并发进程,实现producer与consum
er的并发执行
remobj();〃删除IPC对象。
课题四运用信号量和多线程机制实现“哲学家进餐”问题
一、目的
学习多线程编程,使用线程的同步机制实现“哲学家进餐”问题。具体规定:
1.创建POSIX线程,实现多线程的并发执行,验证多线程共享进程资源的特性。
2.使用互斥量和条件变量,或使用信号量实现线程的同步互斥。
3.验证“哲学家进餐”问题中的死锁情况,并加以解决。
二、准备知识
一方面,请自学课程教材中关于线程同步的内容。
POSIX线程函数库(pthread)为多线程编程提供了一套支持函数,这些函数在头文献P
thread.h中定义,所有多线程程序都必须包含这个头文献。由于pthread库不是Linux系统
的库,所以编译时,需要用-1pthread选项来链接线程库。
1.创建线程
intpthread_create(pthread_t*thread,//线程id指针
pthread_attr_t*attr,//线程属性指针
void*(start_routine)(void*),//返回void类型的指针函数
8。丫oid*arg);//start_routine的形参
该函数成功返回0,失败返回非0值。
例:
/*theexamplefi1eisereatethread.c*/
#include<pthread.h>
#include<stdio.h>
void*create(void*arg)〃新线程执行的函数
{inti;
for(i=0;i<10;i++)
printf(u%dnewthreadcreated%c\n",i,*(char*)arg);
pthread_exit(NULL);〃退出线程
)
intmain(intargc,char*argv[J)//程序从主函数开始
pthread_tp_thread;//线程ID
intret;
chara-A1;
charb=B;
ret=pthread_create(&p_thread,NULL,create,(void*)&a);
//创建新线程执行create函数,传递参数a
create((void*)&b);//主线程执行此函数,传递参数b
编译时使用命令:gcc-1pthread-ocreatethreadcreatethread.c
2.等待子线程结束
#inc1ude<pthread.h>
intpthreadJoin(pthread_tp_thread,void**status);
该函数的第一个参数是线程的ID,第二个参数为子线程返回的值,该函数返回0表达成功,
非0为失败。下面给出“观测者一报告者”线程并发的例子,体会多线程共享数据也许导致的
问题。
#include<pthread.h>
#include<stdio.h>
staticintcount=10;
void"observer"oid*arg)//观测者执行的函数
{inti;
for(i=0;i<100;i++)
printf(nobserver%dcount=%d\n",i,(*(int*)arg)++);
pthread_exit(NULL);//退出线程
)
void*reporter(void*arg)//报告者执行的函数
{inti;
for(i=0;i<100;i++)
(
printf(M%dcount=%d\nn,i,*(int*)arg);
*(int*)arg=0;
)
pthread_exit(NULL);//退出线程
)
intmain(intargc,char*argv[])//主函数
(
pthread_tpl_thread,p2—thread;//线程ID
pthread_create(&pl_thread,NULL,observer,(void*)&count);〃创建新线程
pthread_create(&p2_thread,NULL,reporter,(void**)&count);
pthread_Join(p1_thread,NULL);//主线程等待子线程结束
pthread_join(p2—thread,NULL);
)
3.互斥锁
互斥锁可以解决线程之间互斥访问资源的问题。当一个线程锁定一个互斥量后,可以执行临
界区,而此时另一个线程若要锁定互斥量,将被挂起,直到前一个线程解锁该互斥量后,后
一个线程才干再次锁定互斥量,并进入临界区访问。创建互斥量前,必须先声明一个类型为
Pthread_mutex_t的变量,并对它初始化,例如:
pthread_nutex_t=PTHREAD_MUTEX_INITIALIZER;//该初始化可创建一
个快速互斥量
下面三个函数分别用来锁定互斥量,解锁互斥量以及销毁互斥量
intpthread_mutex_lock(pthread_mutex_t*mutex);
intpthread_mutex_unlock(pthread_mutex_t*mutex);
intpthread_mutex_destroy(pthread_mutex_t*mutex);
三个函数执行对的时,返回0。
4.条件变量
通常互斥量与条件变量同时使用,用互斥量实现线程互斥,用条件变量实现线程间的同步。条
件变量是一种使线程等待某些事件发生的机制。线程等待一个条件变量,直到另一个线程给
该条件变量发送一个信号将该线程唤醒。
(1)创建条件变量
创建条件变量时,必须先声明一个类型为pthread_cond_t类型的变量,并进行初始化。可
以简朴地使用一个宏PTHREAD_CONDJNITIALIZER或调用pthread_cond_ini
t()函数。
例如:pthread_cond_tgot_request=PTHREAD_COND_INITIALIZER
需要注意的是,PTHREAD_COND」NEALIZER是一个结构,只能在条件变量声明时对它
进行初始化,运营时对条件变量初始化必须使用pthread_cond_init()函数。
(2)向条件变量发信号
向条件变量发出信号,可以唤醒等待这个条件变量的一个线程或所有线程(广播方式),使用下
面两个函数可以实现:
intpthread_cond_signa1(&got_request);//got_request是一个已经对的初
始化的条件变量
intpthread_cond_broadcast(&got_request);〃广播函数
成功时返回0,失败时返回非0值。
(3)守候条件变量
pthread_cond_wait(pthread_cond_t*restrictcond,pthread_mutex_t*re
strictmutex);
pthread_cond_timewait(pthread_cond_t*restrictcond,pthread
_mutex_t*restrictmutex,conststructtimespec*restrictabstime);
这两个函数将使调用线程阻塞在条件变量上,并解锁互斥量(为避免竞争使用条件变量,在守
候条件变量前必须加锁互斥量),第二个函数中,允许用户给定一个超时间隔,过了时间间
隔,函数就返回,返回值为ETIMEDOUT。而第一个函数若没有收到信号将一直等下去。
进一步说明上述两个守候条件变量的函数:在守候条件变量前,先对互斥量加锁,然后调用守
候函数,这时,线程阻塞去等候条件,并解锁互斥量,之后,当某个线程向这个条件变量发出
信号便会唤醒等候的线程。
(4)销毁条件变量
intpthread_cond_destory(pthread_cond_t*cond);
成功时返回0,失败时返回非0值。
三、程序框架
#inc1ude<pthread.h>
#include<stdio.h>
#include<errno.h>j............〃声明条件变量和互斥量,以及线程共享的数据
voidP()j{
pthread_mutex_lock();j........
pthread_cond_wait();//等待条件变量
pthread_mutex_un1ock();j........
voidV()j{pthread_mutex_1ock();
pthread_cond_signal();jpthread_mutex_unlock();j}
void*create(void*arg)〃新线程执行的函数乂intph—no;〃哲学家编
号
ph_no=*(int*)arg;
........jP(ph_no);
P((ph_no+l)%5);
printf("theno%dphilosopherdining\n",ph—no);
V(ph_no);jV((ph—no+1)%5);jpthread_exit(NULL);
}jmain()
(
pthread_tp_thread[5];〃线程ID
intph_no[5],ret,i;〃ph_no为哲学家编号,
pthread_create();///创建5个哲学家线程
}“
6课题五基于消息缓冲通信实现客户进程与服务者进程间的通信
一、目的
学习SystemV的进程间通信机制,使用消息缓冲通信实现多个客户进程和一个服务进程之
间的通信。具体规定:
1.创建多个客户进程,以及一个服务进程。
2.创建两个公共消息队列,一个用于客户进程向服务进程发送请求,一个用于服务进程向
客户进程返回结果。
3.客户进程发送请求,并阻塞接受结果,服务进程接受请求并完毕服务后返回结果给相应的客
户进程。
二、准备知识
一方面,请复习课程教材中关于消息缓冲通信的内容。
消息缓冲所涉及的系统调用如下:
1.建立消息队列
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
intmsqid=msgget(key_tkey,intmsgf1g);
其中,key是消息队列的关键字,是通信双方约定的一个长整型数。key有以下两个取值:
(1)IPC_PRIVATE:表达建立一个私有消息队列。
(2)正整数:表达建立一个公共的消息队列。
Msgflg是消息队列的创建方式,有两个取值,这两个值可以单独使用,也可用“或”位运算符连
起来使用:
(1)IPC_CREAT:创建一个key所代表的新消息队列,类似于create。
(2)IPC_EXCL:同IPC_CREAT同时使用时,若key相应消息队列存在,则返回一1,并
将错误指示变量errno置EEXIST,单独使用时无意义。
此外,还可以设立消息队列的存取权限。调用该消息队列系统调用时,若key=O,则创建一
个消息队列,若keyWO,在消息队列中查找关键字是key的消息队列,假如找到,且有权访问,
则返回消息队列标记,假如无权访问则犯错返回,假如没有找到,且msgf1g具有IPC_CRE
AT标志,则创建一个消息队列,并返回消息队列标记。
例如:msqid=msgget(123,0600|IPC_CREAT|IPC_EXCL);
注意:这里0600表达对该消息队列的存取权限,设立的方式同文献存取权限的设立一致。06
00表达对消息队列的创建者具有读写权限,对同组用户和其他用户无任何权限。
2.向消息队列发送消息
#inc1ude<sys/msg.h>
intmsgsnd(intmsqid,void*msgp,size_tmsgsz,intmsgflg);
其中,msqid是消息队列标记,msgp是指向用户区要发送的消息的指针,msgsz是要发送
的消息正文的字节数,msgflg是同步标志,当发送消息的某个条件不满足时,若msgflg
中的IPC_N0WAIT标志未设立(即=0),发送进程阻塞等待,直到将消息挂入消息队列,若IPC
_NOWAIT标志已设立,发送进程立即返回。
该函数,成功时返回实际发送的字节数,错误时返回一1。
3.接受消息
#inc1ude<sys/msg.h>
intmsgrcv(intmsqid,void*msgp,size_tmsgsz,1ongmsgtyp,int
msgflg);
其中,msqid是消息队列标记,msgp是指向用户接受消息的指针,msgsz是要接受的消息
正文的字节数,msgf1g是同步标志,当接受消息的某个条件不满足时,若msgflg中的IPC_
NOWAIT标志未设立(即=0),接受进程阻塞等待,直到接受到消息为止,若IPJN0WAIT
标志已设立,接受进程立即返回。Msgtyp是要接受的消息类型,msgtyp=0,表达接受消息队
列中的第一个消息,若msgtyp>0,则接受消息队列中与msgtyp相同的第一个消息,若m
sgtypV0,则接受消息队列中类型值小于msgtyp绝对值且类型值最小的消息。
该函数成功时,返回接受消息的正文长度,错误时,返回T。
三、程序框架
系统规定最少设立三个客户进程,一个服务进程,客户进程将请求(四则运算)提交给服务进
程,服务进程从消息队列1接受后进行服务(进行运算,求得四则运算表达式的结果),将结
果发送到消息队列2,客户进程从消息队列2接受属于自己的结果。
//clientl.c
#include<sys/types.h>
#include<sys/ipc.h>
#inc1ude<sys/msg.h>
#defineSDKEY75〃SDKEY是发送请求的消息队列关键字,是一个公共消息队列
#defineRVKEY76//RVKEY是接受结果的消息队列关键字,也是一个公共消息队列
structmsgform(//消息的格式
longmtype;/*消息类型*/
charmtext[N];/*消息正文*/
//client2.c
//c1ient3.c
//server.c
课题六银行家算法模拟
一、目的
1.加深了解资源申请、避免死锁等概念。
2.体会避免死锁的具体实行方法——银行家算法的实现过程。
3.进一步提高软件开发能力。
二、规定
1.复习银行家算法,设计一个具有若干(不少于3种)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年粤教版八年级数学下册阶段测试试卷868
- 2024年度二手房买卖委托一站式服务合同3篇
- 校外课程设计 英语
- 2022年广东韶关新丰县一年级上学期六单元语文试卷及答案
- 2021-2022学年江苏省南京市栖霞区小学三年级上册语文期末试题及答案
- 2020年浙江省杭州市椒江区六年级下册期末语文试卷及答案
- 2024年标准垫资服务合作合同样本版B版
- 2024年度知识产权抵押贷款合同大全3篇
- 2025年高考历史复习热搜题速递之秦汉时期(2024年7月)
- 2025年小升初复习之小题狂练300题(多句选词):名词(10题)
- 系统运行维护方案
- 转子找静平衡方法
- 2025年九省联考新高考 政治试卷(含答案解析)
- 终极战略规划指南:深度剖析Cross SWOT分析、市场洞察与内部能力优化的综合行动方案
- 中国偏头痛诊治指南(第一版)2023解读
- 湖北省武汉市黄陂区2024年数学六年级第一学期期末学业质量监测模拟试题含解析
- 关于开展2024年度保密自查自评专项检查工作的实施方案
- 商场反恐防暴应急预案演练方案
- 2024年天津市西青经济开发集团限公司公开招聘工作人员高频500题难、易错点模拟试题附带答案详解
- 数据库设计规范标准
- 2023年全国职业院校技能大赛赛项-ZZ019 智能财税基本技能赛题 - 模块三-答案
评论
0/150
提交评论